m + paliadin walked the open questions; new §0.3 records the calls so the proposal doc reflects the final shape before m ingests via /admin/rules. Net stays at 4 new rules (2 PO + 2 always-fire merits- appeal spawns). de_inf.erwidg flips to court-set per ZPO §276(1) S.2. No ccr-defendant PO, no ccr.appeal duplication, no R.263 deadline.
41 KiB
Fristenrechner Gap-Fill Proposals — t-paliad-203
Date: 2026-05-18
Author: curie (researcher)
Status: DRAFT — for m's review, not yet ingested via /admin/rules
Branch: mai/curie/fristenrechner-gap
Supersedes: t-paliad-201 (cancelled)
Source audit: the four gaps surfaced by mig 093 commit message (t-paliad-200, internal/db/migrations/093_retire_litigation_category.up.sql:40-54) when 40 Pipeline-A litigation rules were archived under _archived_litigation and 7 litigation proceeding_types were dropped
0. Read-this-first — what was archived, what's left
mig 093 (commit 40e49e8) retired the entire category='litigation' rule corpus by:
- Snapshotting the 40 rules into
paliad.deadline_rules_pre_093and the 7 proceeding_types intopaliad.proceeding_types_pre_093. - Re-homing all 40 rules under a holding proceeding_type
_archived_litigation(id 32,category='archived',is_active=false,lifecycle_state='archived'). - Dropping
INF,REV,CCR,APM,APP,AMD,ZPO_CIVILfrompaliad.proceeding_types.
The commit's own body listed four open coverage questions for legal review (lines 40-54 of 093_retire_litigation_category.up.sql):
| # | Pipeline-A rule(s) | Claim in commit body | This doc's verdict |
|---|---|---|---|
| 1 | inf.prelim (R.19, 1 month) |
"not present on UPC_INF — possible coverage gap" | Real gap. Drafts 1.1 + 1.2 below. |
| 2 | inf.appeal / rev.appeal / ccr.appeal (RoP.220.1, 2 months) into UPC_APP |
"fristenrechner UPC_APP starts standalone with no spawn" | Real gap. Drafts 2.1 + 2.2 below. Pipeline-A's three rules collapse to two in the unified UPC_INF (CCR-as-flag) world — see § 2 FLAG. |
| 3 | ccr.amend / rev.amend (spawn into AMD) |
"superseded by inf.app_to_amend / rev.app_to_amend — safe to drop" |
Claim confirmed for patent amendment. No new rules. § 3 documents the verification and surfaces R.263 (case-amendment) as a separate not-modelled item. |
| 4 | zpo.klage / zpo.vertanz / zpo.klageerw / zpo.berufung |
"no UPC analogue; redundant with DE_INF / DE_INF_OLG / DE_INF_BGH / DE_NULL / DE_NULL_BGH" | Claim confirmed for klage / vertanz / berufung. klageerw exists on DE_INF but with a duration discrepancy worth m's attention. § 4 details. |
Net: 4 substantive rule drafts (1 PO on UPC_INF + 1 PO on UPC_REV + 2 merits-appeal spawns) — well under the "~4-10" estimate in the brief, and at the low end because two of the four gaps don't need new rules.
0.1 Naming convention notes
- Appeal proceeding code referenced by ROLE, not by current code. Per task brief and pairing with t-paliad-204 (proceeding-code abbreviation rework, m's review pending), the current
UPC_APP(id=11) is referred to in proposals 2.1/2.2 as "UPC infringement-appeal proceeding (RoP 220.1(a) main-judgment appeal)" rather than by code. m picks the finalspawn_proceeding_type_idwhen ingesting via/admin/rules. - Existing rule-code pattern. Live
UPC_INFrules use bare prefixinf.*(notupc.inf.*), e.g.inf.sod,inf.def_to_ccr. LiveUPC_REVrules userev.*. I follow that pattern: proposed PO rules areinf.prelim(matching Pipeline-A's archived name) andrev.prelim; proposed spawn rules areinf.appeal_spawn/rev.appeal_spawn(the_spawnsuffix disambiguates them from the existing UPC_APP-rootapp.notice, which is the target, not the source). - Anchor semantics (per
docs/audit-fristen-logic-2026-05-13.md§ 4 anddocs/proposals/orphan-concepts-2026-05-15.md§ 0.2):parent_id NOT NULLchains the new rule off an existing rule in the same proceeding.trigger_event_id NOT NULLroots the rule on a paliad/youpc trigger event. The unified Phase 2 schema (Slice 4, mig 081+082) supports both — proposals useparent_idwhenever the natural anchor is an existing intra-proceeding rule (e.g.inf.socfor inf.prelim), which matches the pattern set byinf.sod,inf.def_to_ccr, etc. condition_exprform. Existing UPC_INF / UPC_REV conditional rules use{"flag":"with_ccr"}or{"op":"and","args":[{"flag":"with_ccr"},{"flag":"with_amend"}]}. The proposals add three new flag names —with_po,with_appeal, and reusewith_amendonly where existing. Flag names are surfaced as FLAG items for m to confirm before ingest.
0.2 What's deliberately out of scope
- Order-appeals (R.220.2/R.220.3) spawn wiring — the brief specifies RoP 220.1(a) (main-judgment, 2-month appeal →
UPC_APP). The 15-day order/discretion track lives inUPC_APP_ORDERSand has its own root rules (app_ord.with_leave,app_ord.discretion). Spawn rules from UPC_INF/UPC_REV/UPC_PI for that track would be a separate proposal — flagged as future-work in § 6. - Cost-decision-appeal spawn (R.221.1) —
UPC_COST_APPEALexists withcost.leave_appas a root rule. Same shape as the order-appeals: future-work, not this proposal. - R.263 application to amend the case — surfaced in § 3 but not drafted as a rule because it's court-discretion (no calendar deadline computable from a fixed anchor).
- Vertagungsantrag (ZPO §227) — the brief's description of Gap 4 named "Vertagungsantrag" but the Pipeline-A rule code
zpo.vertanzis actually Verteidigungsanzeige (contraction of "Verteidigungs-Anzeige"), not Vertagungsantrag. There is no Vertagungsantrag rule anywhere in the corpus today; if m wants one, that's a fresh proposal. Documented in § 4 FLAG.
0.3 m's decisions on the open FLAGs (2026-05-18)
Captured live with paliadin/head. Anything not explicitly answered defaults to curie's recommendation.
Gap 1 — Preliminary Objection
- F1.4 (CCR-defendant PO): NO — do not seed a third PO rule for the patentee on a CCR. Final shape stays at 2 PO rules:
inf.prelim+rev.prelim. - F1.1 (flag name): default to curie's
with_po. - F1.2 (priority): default to curie's
optional. - F1.3 (citation pattern): default to curie's
UPC.RoP.19.1substantive-cite for both rules (cross-ref to R.46 lives in the description, not the legal_source field).
Gap 2 — Appeal spawns
- F2.1 (drop
ccr.appeal): CONFIRMED — one decision under R.118 = one 2-month appeal window. Rule 2.3 explicitly NOT seeded. Final shape stays at 2 spawn rules. - F2.3 (appeal flag-gated or always-fire): ALWAYS-FIRE. Rationale (m): "the appeal deadline should always be triggered by a decision … the flags for ccr / amend are different because that is something which only comes up during the proceedings and depends on a party. Appeal is always a possibility." So both
inf.appeal_spawnandrev.appeal_spawnship withoutcondition_expr— the 2-month window unconditionally appears onceinf.decision/rev.decisionis anchored. Visibility filtering ("hide appeal deadlines on projects where the user doesn't care") is a frontend concern, not a rule-level flag — surfaced as follow-up (see § 6.X below). - F2.2 (anchor): default to curie's
parent_id = inf.decision/rev.decision(consistent with howinf.cost_appalready chains).
Gap 3 — ccr.amend / rev.amend
- F3.1 (model R.263?): NO — court-discretion, no calendar deadline computable. If R.263 ever needs surfacing, it goes on the project page as a checklist item, not the fristenrechner.
Gap 4 — zpo.* family
- §4.3 —
de_inf.erwidgdiscrepancy (6 weeks vs. court-set 2-week minimum): FLIP to court-set. Klageerwiderung is statutorily court-set with a 2-week minimum under ZPO §276(1) S.2; the existing 6-week fixed-duration rule is wrong. Action at ingest:is_court_set=true, keepduration_value=6, duration_unit='weeks'as the default display value when no court order is yet attached, with the description noting "Gericht setzt eine Frist von mindestens zwei Wochen ab Verteidigungsanzeige (§276 Abs. 1 S. 2 ZPO)." This matches the pattern existing court-set rules use elsewhere. - F4.1 (legal_source backfills on
de_inf.klageetc.): default to curie's "yes — apply the polish patches in § 4.1, § 4.2, § 4.4".
Final delta to ingest via /admin/rules
NEW RULES (4):
inf.prelim UPC_INF parent=inf.soc 1mo RoP.19.1 flag=with_po optional
rev.prelim UPC_REV parent=rev.app 1mo RoP.19.1 flag=with_po optional
inf.appeal_spawn UPC_INF parent=inf.decision 2mo RoP.220.1.a (no flag) optional spawn→merits-appeal
rev.appeal_spawn UPC_REV parent=rev.decision 2mo RoP.220.1.a (no flag) optional spawn→merits-appeal
PATCHES on existing rules:
de_inf.klage set legal_source = 'DE.ZPO.253'
de_inf.anzeige (no change — already correct)
de_inf.erwidg flip is_court_set = true; description note about §276 Abs.1 S.2
de_inf.berufung (verify legal_source — curie's §4.4 polish patch)
Follow-up surfaced — not for this proposal
- Frontend visibility toggle for appeal deadlines — m flagged that appeals "always fire" at the rule level but the UI could hide them on projects where the user doesn't want to see them. NOT a rule-corpus question; file as a separate frontend task if/when m signals.
ccr.appealin_archived_litigation— the Pipeline-Accr.appealrow stays archived (m's call F2.1). No further action.- Vertagungsantrag (ZPO §227) — never modelled; not in scope. Open follow-up if m wants it.
1. Gap 1 — Preliminary Objection (RoP 19)
Status: Real gap. Pipeline-A had inf.prelim (defendant, 1 month, R.19, "Rarely triggers separate decision; usually decided with main case") — archived without a fristenrechner replacement.
Verification — current UPC_INF / UPC_REV corpus has zero rules with rule_code matching R.19, RoP.019, or any "Preliminary Objection" variant; verified via SELECT * FROM paliad.deadline_rules WHERE rule_code ILIKE '%19%' OR name ILIKE '%vorab%' OR name ILIKE '%prelim%' AND lifecycle_state <> 'archived' returns empty.
Legal context — RoP 19 itself (Application of the Rules of Procedure, Part 1, Chapter 1, Section 4):
- R.19.1: The defendant may, within 1 month of service of the Statement of claim, lodge a Preliminary objection concerning (a) jurisdiction and competence of the Court including any objection to the decision of the Registry to assign a case to a particular division, (b) the language of the Statement of claim (R.14), or (c) the competence of the panel to which the action has been assigned.
- R.19.7 / R.19.8: The Court decides on a preliminary objection by way of order, typically before the interim conference, but may join it to the main proceedings.
- R.46: The Rules in Part 1, Chapter 1 (including R.19) apply mutatis mutandis to revocation actions — i.e. the defendant in a revocation action (the patent proprietor) may also lodge a preliminary objection within 1 month of service of the Statement for revocation.
The Pipeline-A note "Rarely triggers separate decision; usually decided with main case" is accurate practice — but the 1-month deadline to raise the objection is hard and statutory. That deadline is what the fristenrechner needs to model.
Rule 1.1 — Preliminary Objection on UPC_INF
- Rule code:
inf.prelim - Proceeding type: UPC_INF (id=8)
- Name (DE): Vorab-Einrede (R. 19 VerfO)
- Name (EN): Preliminary Objection (RoP 19)
- Party: defendant
- Anchor:
parent_id = inf.soc(the existing root rule "Klageerhebung") — same anchor pattern asinf.sod(Klageerwiderung, also parent=inf.soc).inf.socis the trigger-date anchor; computing 1 month afterinf.socreads as "1 month from service of the Statement of Claim", consistent with R.19.1's wording. - Duration: 1, months
- Timing: after
- Priority: optional (party decides whether to raise the objection; the 1-month period is statutory once invoked)
- is_court_set: false (statutory period from service; not court-set)
- condition_expr:
{"flag":"with_po"}(only renders when the defendant indicates a PO will be filed — same shape as existingwith_ccr/with_amendflags) - Legal source:
UPC.RoP.19.1 rule_code:RoP.019.1- event_type:
filing - Notes: R.19.1 covers three independent grounds (a) jurisdiction/competence, (b) language under R.14, (c) panel competence. All share the same 1-month deadline. The UI rendering decision (one row vs. three rows by ground) is downstream UX, not a rule-corpus question.
- FLAG (F1.1): Flag name —
with_pois suggested by analogy towith_ccr/with_amend/with_cci. Alternative names:with_preliminary_objection,prelim. m's call. - FLAG (F1.2): Priority — proposed
optional(defendant chooses); m may preferrecommendedto surface it as a sanity-check chip on every defendant timeline. The Pipeline-A predecessor hadis_optional=true / is_mandatory=falseper the old binary schema, which maps cleanly topriority='optional'in the post-Slice-3 enum.
Rule 1.2 — Preliminary Objection on UPC_REV
- Rule code:
rev.prelim - Proceeding type: UPC_REV (id=9)
- Name (DE): Vorab-Einrede (R. 19 i.V.m. R. 46 VerfO)
- Name (EN): Preliminary Objection (RoP 19 in conjunction with RoP 46)
- Party: defendant (in a revocation action the patentee is the defendant)
- Anchor:
parent_id = rev.app(the existing root rule "Nichtigkeitsklage" — analogous torev.defencewhich also parents offrev.app) - Duration: 1, months
- Timing: after
- Priority: optional
- is_court_set: false
- condition_expr:
{"flag":"with_po"}(same flag as 1.1 — a PO is a PO; the user setswith_po=trueon a UPC_REV project when the patentee plans to lodge one) - Legal source:
UPC.RoP.46(R.46 makes R.19 applicable to revocation actions; cite R.46 as the operative provision because RoP 19's literal text only addresses infringement) rule_code:RoP.046(orRoP.019.1with a note — m's call; see FLAG F1.3)- event_type:
filing - Notes: Functionally identical to Rule 1.1 but rooted on UPC_REV. The grounds are narrower in practice (language and panel competence are the main triggers — jurisdiction is rarely contested in pure revocation actions because the UPC's jurisdiction over revocation of unitary patents is exclusive). But the 1-month statutory window is identical.
- FLAG (F1.3): Legal-source citation — should this read
UPC.RoP.46(operative provision for revocation) orUPC.RoP.19.1(substantive content)? Existing rules use the substantive citation (e.g.inf.def_to_ccrcitesUPC.RoP.29.a, not the cross-reference that brings R.29 into the UPC_INF flow). I leanUPC.RoP.19.1withrule_code='RoP.019.1'to match that pattern; the cross-reference to R.46 belongs in the description, not the citation field. - FLAG (F1.4): Does paliad want counterclaim-defendant PO rules too? Specifically, when UPC_INF has
with_ccr=true, the claimant (patentee) becomes the de-facto-defendant for the CCR portion. Does the claimant get a 1-month PO window from service of the CCR? My read of R.19 + R.46 + R.25: yes — the CCR triggers a fresh R.19 window for the claimant, anchored on service of the SoD-with-CCR. But this would be a third rule (inf.prelim_ccr, party=claimant, parent=inf.sod, 1 month, condition_expr={"op":"and","args":[{"flag":"with_ccr"},{"flag":"with_po_ccr"}]}). I'm not drafting it pending m's confirmation; either it's truly there in the case law or it's an over-reading on my part. Lex-research won't help here because there's no relevant published UPC PO case on a CCR yet (R.46 + R.25 cross-reads are theoretical).
Summary for Gap 1: 2 new rules drafted (one on UPC_INF, one on UPC_REV). 4 FLAGs. Potential third rule (CCR-PO) deferred pending m's read.
2. Gap 2 — Cross-proceeding APP spawns (RoP 220.1(a))
Status: Real gap. Pipeline-A had three placeholder rules (inf.appeal, rev.appeal, ccr.appeal, all 2 months, RoP.220.1, is_spawn=true) — but their spawn_proceeding_type_id was NULL so they weren't functional spawns either. Fristenrechner UPC_APP currently starts standalone with app.notice as its root rule (party=both, 2 months, RoP.220.1).
Verification — current corpus has zero is_spawn=true AND is_active=true AND lifecycle_state<>'archived' rules; the spawn_proceeding_type_id column on paliad.deadline_rules is unused in the live data (Slice 7 wiring was the design intent but no real spawns have been seeded yet).
Legal context — RoP 220 (Decisions and orders which may be appealed):
- R.220.1(a): Final decisions under R.118 may be appealed. The appeal period is 2 months of service of the decision (R.224.1(a)).
- R.224.1(a): The Statement of appeal must be lodged within 2 months of service of the decision.
- R.224.2(a): The Statement of grounds of appeal must be lodged within 4 months of service of the decision (independent from R.224.1(a), not chained off it).
The spawn target — the proceeding rooted by app.notice (Berufungseinlegung, RoP.220.1, 2 months) and app.grounds (Berufungsbegründung, 4 months from decision) — is what the task brief calls the "UPC infringement-appeal (RoP 220.1(a) main-judgment appeal)" proceeding. Today that's UPC_APP (id=11); per t-paliad-204, the code may be renamed before m ingests these proposals, so I refer to it by role only.
Rule 2.1 — Appeal spawn from UPC_INF
- Rule code:
inf.appeal_spawn - Proceeding type: UPC_INF (id=8)
- Name (DE): Berufung gegen Endentscheidung
- Name (EN): Appeal against final decision
- Party: both (either party may appeal an R.118 final decision adverse to them)
- Anchor:
parent_id = inf.decision(existing court-set rule "Entscheidung"). The chain:inf.soc → … → inf.decision (court-set, no statutory date) → inf.appeal_spawn (2 months after service of decision). Becauseinf.decisionisIsCourtSet=true(perisCourtDeterminedRuleininternal/services/fristenrechner.go), the appeal-spawn deadline only becomes a concrete date once the user anchorsinf.decisionvia the smart-timeline click-to-anchor mechanism (Slice 2,POST /api/projects/{id}/timeline/anchorper memoryab966313-cae6-49b0-8223-9adb62a64370). - Duration: 2, months
- Timing: after
- Priority: optional (party decides whether to appeal; the 2-month period is statutory once invoked)
- is_court_set: false (deadline is statutory once the decision is served)
- condition_expr:
{"flag":"with_appeal"}(only renders when the user has indicated an appeal is contemplated — keeps non-appealing projects' timelines clean) - Legal source:
UPC.RoP.220.1 rule_code:RoP.220.1.a- event_type:
filing - is_spawn: true
- spawn_proceeding_type_id: → UPC infringement-appeal proceeding (currently
UPC_APP, id=11; m picks final code at ingest per t-paliad-204). - spawn_label (DE): "Berufungsverfahren öffnen"
- spawn_label (EN): "Open appeal proceedings"
- Notes: Spawning into the appeal proceeding creates a child project (or routes into the standalone UPC_APP fristenrechner depending on how spawn rendering works on the project page). The 4-month Statement of grounds period (R.224.2(a),
app.grounds) is already a root rule on UPC_APP — once the appeal child opens, that timeline takes over. No need to also modelapp.groundsas a spawn rule from UPC_INF; the existing UPC_APP root rules cover it. - FLAG (F2.1): Does the spawn fire on the CCR portion of the decision too? In a
with_ccr=trueUPC_INF, the R.118 final decision adjudicates both the infringement and the counterclaim for revocation. Either side may appeal either part. My read: one spawn covers both — there's only one R.118 decision, one 2-month window. The Pipeline-Accr.appealwas a relic of the days when CCR was a separate proceeding type. Recommend dropping the third "ccr.appeal" entirely, because in the unified UPC_INF (CCR-as-flag) model it would duplicate Rule 2.1. m to confirm. - FLAG (F2.2): Anchor — should the spawn rule chain off
inf.decision(court-set, requires anchor-click) or be event-rooted on afinal_decision_servicetrigger event (paliad has trigger_event id=88 "Endentscheidung (Zustellung)")? Both work. Chaining oninf.decisionkeeps the rule visually attached to its parent proceeding in the UI; event-rooted is more flexible if the user wants to compute an appeal deadline standalone without a project. Recommendparent_id = inf.decisionto match howinf.cost_appchains offinf.decisionalready. - FLAG (F2.3): Flag name —
with_appealmirrors the existingwith_ccr/with_amendflag naming. Alternative: spawn rules might always fire (no flag), letting the timeline show the appeal window as a "predicted/court-set" placeholder. The latter is closer to what the SmartTimeline projection (projection_service.go) already does for cross-proceeding rules per memory686f0b8c-02ed-4807-8785-b088e3a3e515§ 6 gap 7. If m wants the appeal window to always appear after the decision (unconditionally), dropcondition_exprhere and on Rule 2.2.
Rule 2.2 — Appeal spawn from UPC_REV
- Rule code:
rev.appeal_spawn - Proceeding type: UPC_REV (id=9)
- Name (DE): Berufung gegen Endentscheidung (Nichtigkeit)
- Name (EN): Appeal against final decision (revocation)
- Party: both
- Anchor:
parent_id = rev.decision(existing court-set rule "Entscheidung") - Duration: 2, months
- Timing: after
- Priority: optional
- is_court_set: false
- condition_expr:
{"flag":"with_appeal"} - Legal source:
UPC.RoP.220.1 rule_code:RoP.220.1.a- event_type:
filing - is_spawn: true
- spawn_proceeding_type_id: → same UPC infringement-appeal proceeding as Rule 2.1. The UPC CoA hears both INF and REV appeals; in a
with_cci=trueUPC_REV (Verletzungswiderklage / counterclaim-for-infringement), the R.118 decision may also adjudicate the infringement piece, but again it's one decision, one appeal window. - spawn_label (DE): "Berufungsverfahren öffnen"
- spawn_label (EN): "Open appeal proceedings"
- Notes: Functionally a mirror of Rule 2.1 on the revocation proceeding. Same FLAGs F2.1-F2.3 apply.
Rule 2.3 — (proposed) NOT drafted: separate ccr.appeal from UPC_INF with_ccr
See FLAG F2.1. In the unified model, the CCR portion of an UPC_INF decision is appealed via the same R.118 final-decision spawn (Rule 2.1) — a single 2-month window covers infringement, revocation, and patent-amendment claims because they all sit in one R.118 decision. Drafting ccr.appeal as a third rule would duplicate Rule 2.1 conditionally ({"op":"and","args":[{"flag":"with_ccr"},{"flag":"with_appeal"}]}) and produce a redundant timeline row. Recommendation: do not seed. If m disagrees, the rule shape would be:
inf.appeal_spawn_ccr (UPC_INF)
condition_expr: {"op":"and","args":[{"flag":"with_ccr"},{"flag":"with_appeal"}]}
spawn_label: "Berufung Nichtigkeit öffnen" (specifically the CCR portion)
Only useful if the appeal UI needs to distinguish "appealing the infringement finding" from "appealing the revocation finding". Today's fristenrechner UI doesn't make that distinction; the appeal proceeding handles both.
Summary for Gap 2: 2 new spawn rules drafted. 3 FLAGs. The third Pipeline-A relic (ccr.appeal) is structurally redundant and recommended not to seed.
3. Gap 3 — ccr.amend / rev.amend (verification of "safe to drop" claim)
Status: No new rules needed. The migration's claim ("superseded by inf.app_to_amend / rev.app_to_amend — safe to drop") is confirmed for the patent-amendment scope. There is a separate concept (R.263 application to amend the case) that has never been modelled and probably shouldn't be — see § 3.2.
3.1 Verification — patent-amendment coverage
Pipeline-A's ccr.amend and rev.amend were both:
- duration_value=0, duration_unit='months', event_type='filing', is_spawn=true, party='claimant'
- legal_source=NULL, rule_code=NULL
- source proceeding=AMD (now archived)
- "Application to Amend Patent" / no German name
These were placeholder spawns into a hypothetical "AMD" (Application to amend the patent) proceeding type that never existed as a real fristenrechner tree. They modelled the concept "filing a patent amendment", not its deadline.
The unified UPC_INF / UPC_REV corpus already covers patent amendment with real deadlines and flag-gated chains:
| Existing rule | Proceeding | Trigger / parent | Duration | Legal source | Flag-gating |
|---|---|---|---|---|---|
inf.app_to_amend |
UPC_INF | parent=inf.sod | 2 months | UPC.RoP.30.1 | with_ccr+with_amend |
inf.def_to_amend |
UPC_INF | parent=inf.app_to_amend | 2 months | UPC.RoP.32.1 | with_ccr+with_amend |
inf.reply_def_amd |
UPC_INF | parent=inf.def_to_amend | 1 month | UPC.RoP.32.3 | with_ccr+with_amend |
inf.rejoin_amd |
UPC_INF | parent=inf.reply_def_amd | 1 month | UPC.RoP.32.3 | with_ccr+with_amend |
rev.app_to_amend |
UPC_REV | parent=rev.defence | 0 months (filed-with-parent) | UPC.RoP.49.2.a | with_amend |
rev.def_to_amend |
UPC_REV | parent=rev.app_to_amend | 2 months | UPC.RoP.43.3 | with_amend |
rev.reply_def_amd |
UPC_REV | parent=rev.def_to_amend | 1 month | UPC.RoP.32.3 | with_amend |
rev.rejoin_amd |
UPC_REV | parent=rev.reply_def_amd | 1 month | UPC.RoP.32.3 | with_amend |
The flag-gated chain on UPC_INF (with_ccr+with_amend) is the post-2026-05-05 ship from t-paliad-131 PR-2 (memory ba1517a3-2294-4c58-aeb6-87e82067834d); the UPC_REV chain (with_amend and with_cci) is from the same PR. Both fully replace what ccr.amend / rev.amend ever could have represented.
Verdict on Gap 3: "Safe to drop" is correct. No new rules.
3.2 R.263 — Application to amend the case (not modelled, probably shouldn't be)
R.263 ("Leave to change claim or amend case") is conceptually different from R.30 (Application to amend the patent). R.263 governs amendment of the pleadings / case — adding a new infringement allegation, narrowing claims, etc. The current corpus has no R.263 rule.
I'm not proposing one because R.263 is purely court-discretionary (R.263.1: "An application may be made by a party at any time to … amend its case … Leave shall be granted only if … the requesting party could not with reasonable diligence have made the application earlier and the amendment will not unreasonably hinder the other party in the conduct of its action"). There is no statutory deadline computable from a fixed anchor — the party files when it needs to, and the court grants or refuses leave by order. Modelling it as a deadline_rule would either:
- (a) Produce a phantom row with no computable date (the existing
is_court_set=truepattern would technically work but offers no UX value because the deadline is "whenever you need to amend"). - (b) Produce a misleading row anchored on the SoC date with some heuristic period.
Recommendation: don't seed. If m wants R.263 surfaced anywhere, it belongs as a checklist item on the project page, not as a fristenrechner rule.
FLAG (F3.1): Confirm "don't model R.263" is acceptable. If R.263 should be modelled, what anchor + duration heuristic should it use?
Summary for Gap 3: 0 new rules. 1 FLAG. The claim "safe to drop" is verified for patent amendment. R.263 is a separate concept and intentionally left unmodelled.
4. Gap 4 — zpo.* family vs. existing DE_INF / DE_INF_OLG / DE_INF_BGH
Status: No new rules needed for klage, vertanz, berufung. Existing rule de_inf.erwidg (Klageerwiderung) has a duration discrepancy worth m's attention. Task brief's mention of "Klageerweiterung" / "Vertagungsantrag" is a misread of Pipeline-A rule names — those concepts are not in scope here. § 4.1-4.4 verify each Pipeline-A rule; § 4.5 surfaces what would be a real gap if m wants ZPO §227 modelled.
4.1 zpo.klage (Klageerhebung, ZPO §253) — ✓ redundant
Pipeline-A: claimant, 0 months, filing, § 253 ZPO, legal_source=NULL.
Existing rule de_inf.klage on DE_INF: claimant, 0 months, filing. Functionally identical as a root rule (a 0-duration "trigger" anchor). Legal source on the existing rule is NULL — could be backfilled to DE.ZPO.253 as a minor polish, but no new rule needed.
Verdict: no gap. Optional polish: set de_inf.klage.legal_source = 'DE.ZPO.253' (one-line UPDATE; not a new rule). FLAG F4.1.
4.2 zpo.vertanz (Verteidigungsanzeige, ZPO §276(1) Satz 1) — ✓ redundant
Task-brief naming note: the brief described this gap as "Vertagungsantrag" but Pipeline-A's zpo.vertanz is actually Verteidigungsanzeige (contraction "VertAnz" not "VertA. (Antrag)"). The rule name in the snapshot reads "Verteidigungsanzeige" verbatim. Vertagungsantrag (§ 227 ZPO) is a different concept entirely — see § 4.5.
Pipeline-A: defendant, 2 weeks, filing, § 276 Abs. 1 S. 1 ZPO, deadline_notes "Notfrist ab Zustellung der Klageschrift".
Existing rule de_inf.anzeige on DE_INF: defendant, 2 weeks, DE.ZPO.276.1, "Anzeige der Verteidigungsbereitschaft". Same period, same legal basis, same party.
Verdict: no gap.
4.3 zpo.klageerw (Klageerwiderung, ZPO §276(1) Satz 2) — ⚠ duration discrepancy
Pipeline-A: defendant, 2 weeks, filing, § 276 Abs. 1 S. 2 ZPO, legal_source=NULL, deadline_notes "Vom Gericht gesetzt, mindestens 2 Wochen".
Existing rule de_inf.erwidg on DE_INF: defendant, 6 weeks, DE.ZPO.276.1, "Klageerwiderung", is_court_set=false.
This is a substantive discrepancy. Both rules cite the same statutory anchor (ZPO §276(1) Satz 2), but:
- Pipeline-A modelled the statutory floor ("mindestens 2 Wochen") with
is_court_setimplicit (the deadline_notes said "Vom Gericht gesetzt"). - DE_INF models a typical court-practice heuristic (6 weeks is a common Munich/Düsseldorf LG setting, though 4-8 weeks is the realistic range).
The DE_INF rule is strictly more useful for a practitioner planning a defence schedule (the 2-week floor is rarely the actual deadline; the court order sets the real date). But it's technically wrong to mark is_court_set=false because the date is set by court order — the 6 weeks is a guess at what the court will set, not a statutory period.
No new rule needed, but two corrections are worth flagging on the existing rule:
- FLAG F4.2 (correctness): Set
de_inf.erwidg.is_court_set = true. The deadline date is set by the court's Klageerwiderungsfrist order under §276(1) Satz 2, not by the statute directly. This matches how Schriftsatznachreichung (§296a) was flagged indocs/proposals/orphan-concepts-2026-05-15.md§ 2.1 FLAG F8. - FLAG F4.3 (heuristic transparency): 6 weeks vs. the statutory 2-week floor — the deadline_notes (DE) on
de_inf.erwidgshould probably say "Vom Gericht gesetzt, mindestens 2 Wochen (§ 276 Abs. 1 S. 2 ZPO); typische Praxis: 4-8 Wochen" rather than just rendering as a hard 6-week deadline. UX consideration, not a rule-shape question.
Neither change is a new rule; both are PATCH operations on the existing row via /admin/rules.
4.4 zpo.berufung (Berufung, ZPO §517) — ✓ redundant (twice over)
Pipeline-A: both, 1 month, filing, § 517 ZPO, DE.ZPO.517, deadline_notes "Notfrist ab Zustellung des vollständigen Urteils".
Existing rules:
de_inf.berufungon DE_INF: both, 1 month,DE.ZPO.517. Same shape.de_inf_olg.berufungon DE_INF_OLG: both, 1 month,DE.ZPO.517. Same shape (covers the OLG-instance entry point).
Either rule covers it. Verdict: no gap.
4.5 Real gap (if m wants): Vertagungsantrag (ZPO §227)
The task brief mentioned "Vertagungsantrag" by name. Pipeline-A had no Vertagungsantrag rule (the zpo.vertanz rule code is a contraction of Verteidigungsanzeige, not Vertagungsantrag — see § 4.2). The current corpus has no Vertagungsantrag rule either.
ZPO §227 governs applications to adjourn a hearing ("Aufhebung und Verlegung von Terminen, Vertagung der Verhandlung"). §227.1 requires "erhebliche Gründe", §227.2 gives examples (verhinderter Anwalt etc.), §227.3 restricts adjournment of evidence hearings (Beweisaufnahme). There is no statutory deadline for filing a Vertagungsantrag — it's "as soon as the ground arises and, in practice, as early as possible before the hearing date". The application is court-discretionary (§227.1: "kann").
I would not recommend modelling Vertagungsantrag as a deadline_rule for the same reason as R.263 in § 3.2: there's no statutory deadline anchor; it's a checklist concept, not a calendar deadline. But m may have a different view — flag F4.4.
FLAG (F4.4): Should Vertagungsantrag be modelled? If yes, what anchor + duration? Most natural seed would be condition_expr={"flag":"with_vertagung"} on the relevant hearing rule (de_inf.termin, de_null.termin, etc.), is_court_set=true, no duration. But that's an oddly-shaped rule that produces no useful date.
Summary for Gap 4: 0 new rules. 4 FLAGs (F4.1-F4.4). The migration's "redundant — safe to drop" claim is confirmed for klage / vertanz / berufung. klageerw exposes a discrepancy on the existing de_inf.erwidg rule (is_court_set=false is wrong; 6-weeks heuristic should be transparent in notes) — both are PATCH operations on the existing row, not new rules. Vertagungsantrag is a separate concept that probably shouldn't be modelled as a deadline_rule.
5. Track A — Polish UPDATEs on existing rows (no new rules, no legal review)
Distinct from new rules, three existing rows could be PATCH'd via /admin/rules to improve correctness or transparency. None of these are required for the gap-fill to be considered "done" — they're flagged so they don't get lost if m wants to address them in the same ingest session.
| # | Row | Field | From | To | Reason |
|---|---|---|---|---|---|
| P1 | de_inf.klage (DE_INF) |
legal_source |
NULL | DE.ZPO.253 |
Polish; matches existing convention (Rule 1.1's UPC.RoP.19.1 etc.). |
| P2 | de_inf.erwidg (DE_INF) |
is_court_set |
false | true | Correctness; deadline is court-order-set per ZPO §276(1) Satz 2. |
| P3 | de_inf.erwidg (DE_INF) |
deadline_notes (DE) |
(current text) | "Vom Gericht gesetzt, mindestens 2 Wochen (§ 276 Abs. 1 S. 2 ZPO); typische Praxis: 4-8 Wochen" | Transparency; the 6-week duration is a heuristic, not statutory. |
6. Track B — Genuinely new rule drafts (this proposal's substantive output)
| # | Gap | Rule code | Proceeding (by role) | Source |
|---|---|---|---|---|
| 1.1 | 1 (PO) | inf.prelim |
UPC_INF | RoP 19.1 |
| 1.2 | 1 (PO) | rev.prelim |
UPC_REV | RoP 19.1 i.V.m. R.46 |
| 2.1 | 2 (APP spawn) | inf.appeal_spawn |
UPC_INF, spawn → UPC infringement-appeal proceeding | RoP 220.1(a) / R.224.1(a) |
| 2.2 | 2 (APP spawn) | rev.appeal_spawn |
UPC_REV, spawn → UPC infringement-appeal proceeding | RoP 220.1(a) / R.224.1(a) |
Total new rules: 4. Plus 3 optional polish PATCHes in § 5. None of the proposed rules introduce new flag-name conventions (other than with_po and with_appeal, which mirror existing with_ccr / with_amend / with_cci).
Future-work (not this proposal)
- Order-appeals spawn (R.220.2 / R.220.3) from UPC_INF / UPC_REV / UPC_PI → UPC_APP_ORDERS (15-day track). Today UPC_APP_ORDERS has only standalone root rules.
- Cost-decision-appeal spawn (R.221.1) from UPC_INF / UPC_REV → UPC_COST_APPEAL.
- CCR-defendant PO (FLAG F1.4): claimant's 1-month PO window when receiving SoD-with-CCR — only if confirmed against real case law or m's read.
- R.263 (case amendment) and ZPO §227 (Vertagungsantrag): both court-discretionary, no statutory deadline — recommend leaving unmodelled (FLAGs F3.1, F4.4).
- DE_NULL / DE_NULL_BGH appeal spawns: PatG §110 chains DE_NULL → DE_NULL_BGH (Berufung BGH). Currently DE_NULL_BGH is a standalone tree rooted on
de_null_bgh.urteil_bpatg. Same pattern as the UPC spawn gap. Out of brief scope but worth a parallel proposal.
7. Open questions / FLAGs index
For convenience, all **FLAG**-marked items in one place. m's decision is needed on each before /admin/rules ingest of the corresponding rule (or rule edit).
| ID | Section | Question |
|---|---|---|
| F1.1 | § 1.1 | Flag name for Preliminary Objection — with_po vs with_preliminary_objection vs prelim. |
| F1.2 | § 1.1 | Priority for PO — optional (recommended) vs recommended (always-surface as sanity-check chip). |
| F1.3 | § 1.2 | Legal-source citation for UPC_REV PO — UPC.RoP.19.1 (substantive) vs UPC.RoP.46 (operative). Recommend substantive. |
| F1.4 | § 1.2 | Add a third PO rule for CCR-defendant (party=claimant, fires when with_ccr=true)? |
| F2.1 | § 2.1 | Recommend not seeding ccr.appeal as a third rule — CCR appeal is covered by inf.appeal_spawn (one R.118 decision, one window). Confirm. |
| F2.2 | § 2.1 | Anchor for spawn — parent_id = inf.decision (chain) vs trigger_event_id = 88 final_decision_service (event-rooted). Recommend chain. |
| F2.3 | § 2.1 | Flag-gated (with_appeal) vs always-rendered. Recommend flag-gated to keep non-appealing timelines clean; SmartTimeline's "predicted" rendering of cross-proceeding rules is the alternative. |
| F3.1 | § 3.2 | R.263 (case amendment) — confirm not modelled as a deadline_rule. |
| F4.1 | § 4.1 | Polish P1: backfill de_inf.klage.legal_source = 'DE.ZPO.253'? |
| F4.2 | § 4.3 | Polish P2: set de_inf.erwidg.is_court_set = true? |
| F4.3 | § 4.3 | Polish P3: improve de_inf.erwidg.deadline_notes to expose the 6-week heuristic vs the 2-week statutory floor? |
| F4.4 | § 4.5 | Vertagungsantrag (ZPO §227) — confirm not modelled. |
8. Sources cited
| Citation key | Reference |
|---|---|
UPC.RoP.19.1 |
UPC Rules of Procedure, Rule 19(1) — Preliminary objection |
UPC.RoP.19.7 |
UPC RoP Rule 19(7) — Court decides preliminary objection by order |
UPC.RoP.25 |
UPC RoP Rule 25 — Lodging of Counterclaim for Revocation (cross-ref for FLAG F1.4) |
UPC.RoP.30.1 |
UPC RoP Rule 30(1) — Application to amend the patent (cross-ref for § 3.1) |
UPC.RoP.46 |
UPC RoP Rule 46 — Part 1 Chapter 1 (incl. R.19) applies mutatis mutandis to revocation actions |
UPC.RoP.118 |
UPC RoP Rule 118 — Final decisions on the merits |
UPC.RoP.151 |
UPC RoP Rule 151 — Cost decision (cross-ref for existing inf.cost_app) |
UPC.RoP.220.1.a |
UPC RoP Rule 220(1)(a) — Appeal against R.118 final decision |
UPC.RoP.220.2 |
UPC RoP Rule 220(2) — Order appeals with leave (cross-ref, future work) |
UPC.RoP.220.3 |
UPC RoP Rule 220(3) — Discretionary review (cross-ref, future work) |
UPC.RoP.221.1 |
UPC RoP Rule 221(1) — Cost-decision appeal (cross-ref, future work) |
UPC.RoP.224.1.a |
UPC RoP Rule 224(1)(a) — Statement of appeal lodged within 2 months |
UPC.RoP.224.2.a |
UPC RoP Rule 224(2)(a) — Statement of grounds within 4 months |
UPC.RoP.263 |
UPC RoP Rule 263 — Leave to change claim or amend case |
DE.ZPO.227 |
ZPO §227 — Vertagung und Terminsänderung |
DE.ZPO.253 |
ZPO §253 — Klageschrift |
DE.ZPO.276.1 |
ZPO §276(1) — Verteidigungsanzeige (S.1) und Klageerwiderungsfrist (S.2) |
DE.ZPO.517 |
ZPO §517 — Berufungsfrist (1 Monat ab Zustellung) |
9. What's next (if m approves)
- Decide the 12 FLAGs in § 7 (mostly flag names, priorities, and the three PATCH operations on existing rows). None require legal-side research — they're product/UX calls.
- Confirm the appeal target's final proceeding-code post-t-paliad-204 rename. Until then, ingest using whatever code lives at id=11 (currently
UPC_APP) and rename via mig if t-paliad-204 lands with a different code. - Ingest the 4 new rules via
/admin/rulesPOST (Slice 11a backend, Slice 11b frontend). Each goes intolifecycle_state='draft'first. Promote topublishedafter spot-checking via the calculator preview endpoint with a test project (e.g. UPC_INF withwith_po=trueshould show the newinf.prelimrow 1 month after the trigger date). - Optionally apply the 3 PATCHes in § 5 in the same session.
- Verify spawn rendering end-to-end — the spawn_proceeding_type_id column is unused in live data today, so this is the first real consumer. The SmartTimeline projection (per
internal/services/projection_service.go, memory686f0b8c-…) early-returns on spawn rules when "we don't have that rule in our map" — that code path needs to actually render a spawn row now, not no-op. May require a Slice 7 follow-up tweak inprojection_service.goto honourspawn_proceeding_type_idand surface the appeal proceeding's root deadline as a spawned child row.
Estimated corpus delta after ingest: Track B = 4 new rules → paliad.deadline_rules row count grows from 249 to 253. Track A polish = 3 row-level PATCHes (no row count change). One new is_spawn=true row goes live for the first time, exercising the previously-unused spawn_proceeding_type_id wiring.