Editorial backlog: seed 279 candidate UPC RoP events into deadline_rules (full catalog gap) #143

Open
opened 2026-05-26 17:30:36 +00:00 by mAi · 1 comment
Collaborator

Context

Follow-up to issue #142 (which covered just the 6 UPC PI respondent gaps surfaced during HL/mWorkRepo's Schulung prep). m asked: extract every event from the UPC RoP systematically and cross-reference against paliad's catalog.

Researcher (darwin worker on HL/mWorkRepo) completed the full extraction. Output committed at 441a59b on HL/mWorkRepo:

Scale

  • 319 events extracted from RoP
  • 153 events in paliad today (is_active=true, lifecycle_state='published'), across 18 proceeding_types + 77 distinct RoP rules
  • 279 events are new candidates (40 already matched on legal_source)
  • 27 proceeding_type-codes are entirely absent from paliad's taxonomy

This is roughly 13% RoP coverage in paliad today. The remainder is editorial backlog.

Missing proceeding_type codes (27)

Grouped by category, with the count of new events per type:

Cross-cutting / framework

Proposed code Description New events
general General Provisions 13
upc.case.mgmt Case Management (cross-cutting) 6
upc.service Service of Pleadings 11
upc.representation Representation / Privilege 4
upc.parties Change of Parties / Transfer of Patent 7
upc.fees Court Fees 7
upc.legalaid Legal Aid 10
upc.language Language of Proceedings 7
upc.reestablishment Re-establishment of Rights 3

Pre-action / standalone procedures

Proposed code Description New events
upc.optout.cfi Application to opt out (Registry procedure) 3
upc.dni.cfi Declaration of Non-Infringement (CFI) 6
upc.epo.review.cfi Review of EPO decisions (ex parte CFI) 17

CFI sub-phases (currently bundled into upc.inf.cfi in paliad)

Proposed code Description New events
upc.cfi.interim CFI - Interim Procedure 9
upc.cfi.oral CFI - Oral Procedure 5
upc.cfi.decision CFI - Decision / Judgment 1
upc.costs.cfi Separate Cost Decision (CFI) 3
upc.security.cfi Security for Costs (CFI) 4

Evidence procedures

Proposed code Description New events
upc.evidence.cfi Evidence - general orders (CFI) 16
upc.bsv.cfi Evidence Preservation / Beweissicherung / saisie (CFI) 18
upc.inspection.cfi Order for Inspection (CFI) 2
upc.freezing.cfi Order to Freeze Assets (CFI) 1
upc.experiments.cfi Court-ordered Experiments (CFI) 3

Appeal-side

Proposed code Description New events
upc.rehearing.coa Application for Rehearing (CoA) 5
upc.intervention Intervention (CFI / CoA) 5

Exceptional

Proposed code Description New events
upc.default Decision by Default (CFI / CoA) 5
upc.special Special Situations (no need to adjudicate / manifestly inadmissible / settlement) 3
upc.withdrawal Withdrawal 1

Plus: gaps within existing proceeding_types

The 18 proceeding_types already in paliad also have gaps — events in the RoP that map to those types but aren't yet seeded. The gap report (§1.B) breaks these out. Examples:

  • upc.inf.cfi: missing Application to Amend Patent timeline events, Defence to amendment, defendant's reply to PA defence, etc.
  • upc.pi.cfi: the 6 from issue #142 + the few above (interim/oral/decision)
  • upc.cfa.coa: appeal-stage interim procedure events, cross-appeal timing variants

Don't try to seed all 279 at once. Per the gap report's §5 Open Questions:

  1. Decide naming convention first. Existing paliad codes (upc.<proc>.<phase>.<action>) work for most, but the 27 new types need stable codes before seeding. The proposed codes above are darwin's suggestions — m / paliad/head review before locking in.

  2. Decide proceeding_type granularity. Should upc.cfi.interim / upc.cfi.oral / upc.cfi.decision be standalone, or sub-codes of upc.inf.cfi/upc.rev.cfi? Affects whether the count is 27 new types or fewer.

  3. Prioritize seeding by user impact. Highest-impact first (= what HL PAs actually run into daily):

    • upc.bsv.cfi (Beweissicherung — 18 events, PA-relevant)
    • upc.optout.cfi (3 events, every patent matter)
    • upc.dni.cfi (6 events, defensive standard)
    • upc.cfi.interim/oral/decision (15 events, every contested matter)
    • upc.epo.review.cfi (17 events, EPO-bridge)
    • Then the cross-cutting ones (general, upc.fees, upc.legalaid)
    • Then the rest
  4. Per proceeding_type, file a separate sub-issue linking back here. Lets editorial work parallelize. Or batch-seed via CSV import if /admin/rules supports that.

  5. Reconfirm fristen against RoP volltext before publishing. darwin's frist values are extracted verbatim from rule text; paliad's normalization (days/months conversion) may need a second pass.

Out of scope (deferred follow-ups)

  • EPC opposition rules - sibling catalog later
  • UPC Agreement substantive articles - only the few cited as legal basis for RoP events (Art. 60(9), Art. 62) are touched here
  • yoUPC case law mapping to events - separate project

Source documents in HL/mWorkRepo

Commit 441a59b (today, 2026-05-26):

  • Branch: main
  • Repo: HL/mWorkRepo

The three files are the authoritative source. paliad-side seeding decisions go back to those for verification.

  • Predecessor / pilot: paliad #142 (6 PI respondent events)
  • HL Schulung trigger: 28.05 Fristen-Schulung, where C6 PI-drawing surfaced the gaps
  • Conceptual frame: 3 - areas/UPC/UPC Deadlines - PA Workflow Framework.md
## Context Follow-up to issue [#142](https://mgit.msbls.de/m/paliad/issues/142) (which covered just the 6 UPC PI respondent gaps surfaced during HL/mWorkRepo's Schulung prep). m asked: extract every event from the UPC RoP systematically and cross-reference against paliad's catalog. **Researcher (`darwin` worker on HL/mWorkRepo) completed the full extraction.** Output committed at `441a59b` on HL/mWorkRepo: - [`UPC RoP Event Catalog 2026-05.md`](https://mgit.msbls.de/HL/mWorkRepo/src/branch/main/3%20-%20areas/UPC/UPC%20RoP%20Event%20Catalog%202026-05.md) - 319 events from 303 RoP rules, 657 lines - [`UPC RoP - Catalog Gaps 2026-05.md`](https://mgit.msbls.de/HL/mWorkRepo/src/branch/main/3%20-%20areas/UPC/UPC%20RoP%20-%20Catalog%20Gaps%202026-05.md) - 580 lines - [`UPC RoP - Event Connection Graph 2026-05.md`](https://mgit.msbls.de/HL/mWorkRepo/src/branch/main/3%20-%20areas/UPC/UPC%20RoP%20-%20Event%20Connection%20Graph%202026-05.md) - 218 lines, mermaid parent->child diagrams ## Scale - **319 events** extracted from RoP - **153 events** in paliad today (`is_active=true`, `lifecycle_state='published'`), across **18 proceeding_types** + **77 distinct RoP rules** - **279 events** are new candidates (40 already matched on `legal_source`) - **27 proceeding_type-codes** are entirely absent from paliad's taxonomy This is roughly **13% RoP coverage** in paliad today. The remainder is editorial backlog. ## Missing proceeding_type codes (27) Grouped by category, with the count of new events per type: ### Cross-cutting / framework | Proposed code | Description | New events | |---|---|---:| | `general` | General Provisions | 13 | | `upc.case.mgmt` | Case Management (cross-cutting) | 6 | | `upc.service` | Service of Pleadings | 11 | | `upc.representation` | Representation / Privilege | 4 | | `upc.parties` | Change of Parties / Transfer of Patent | 7 | | `upc.fees` | Court Fees | 7 | | `upc.legalaid` | Legal Aid | 10 | | `upc.language` | Language of Proceedings | 7 | | `upc.reestablishment` | Re-establishment of Rights | 3 | ### Pre-action / standalone procedures | Proposed code | Description | New events | |---|---|---:| | `upc.optout.cfi` | Application to opt out (Registry procedure) | 3 | | `upc.dni.cfi` | Declaration of Non-Infringement (CFI) | 6 | | `upc.epo.review.cfi` | Review of EPO decisions (ex parte CFI) | 17 | ### CFI sub-phases (currently bundled into upc.inf.cfi in paliad) | Proposed code | Description | New events | |---|---|---:| | `upc.cfi.interim` | CFI - Interim Procedure | 9 | | `upc.cfi.oral` | CFI - Oral Procedure | 5 | | `upc.cfi.decision` | CFI - Decision / Judgment | 1 | | `upc.costs.cfi` | Separate Cost Decision (CFI) | 3 | | `upc.security.cfi` | Security for Costs (CFI) | 4 | ### Evidence procedures | Proposed code | Description | New events | |---|---|---:| | `upc.evidence.cfi` | Evidence - general orders (CFI) | 16 | | `upc.bsv.cfi` | Evidence Preservation / Beweissicherung / saisie (CFI) | 18 | | `upc.inspection.cfi` | Order for Inspection (CFI) | 2 | | `upc.freezing.cfi` | Order to Freeze Assets (CFI) | 1 | | `upc.experiments.cfi` | Court-ordered Experiments (CFI) | 3 | ### Appeal-side | Proposed code | Description | New events | |---|---|---:| | `upc.rehearing.coa` | Application for Rehearing (CoA) | 5 | | `upc.intervention` | Intervention (CFI / CoA) | 5 | ### Exceptional | Proposed code | Description | New events | |---|---|---:| | `upc.default` | Decision by Default (CFI / CoA) | 5 | | `upc.special` | Special Situations (no need to adjudicate / manifestly inadmissible / settlement) | 3 | | `upc.withdrawal` | Withdrawal | 1 | ## Plus: gaps within existing proceeding_types The 18 proceeding_types already in paliad also have gaps — events in the RoP that map to those types but aren't yet seeded. The gap report (§1.B) breaks these out. Examples: - `upc.inf.cfi`: missing Application to Amend Patent timeline events, Defence to amendment, defendant's reply to PA defence, etc. - `upc.pi.cfi`: the 6 from issue #142 + the few above (interim/oral/decision) - `upc.cfa.coa`: appeal-stage interim procedure events, cross-appeal timing variants ## Recommended editorial workflow Don't try to seed all 279 at once. Per the gap report's §5 Open Questions: 1. **Decide naming convention first.** Existing paliad codes (`upc.<proc>.<phase>.<action>`) work for most, but the 27 new types need stable codes before seeding. The proposed codes above are darwin's suggestions — m / paliad/head review before locking in. 2. **Decide proceeding_type granularity.** Should `upc.cfi.interim` / `upc.cfi.oral` / `upc.cfi.decision` be standalone, or sub-codes of `upc.inf.cfi`/`upc.rev.cfi`? Affects whether the count is 27 new types or fewer. 3. **Prioritize seeding by user impact.** Highest-impact first (= what HL PAs actually run into daily): - `upc.bsv.cfi` (Beweissicherung — 18 events, PA-relevant) - `upc.optout.cfi` (3 events, every patent matter) - `upc.dni.cfi` (6 events, defensive standard) - `upc.cfi.interim/oral/decision` (15 events, every contested matter) - `upc.epo.review.cfi` (17 events, EPO-bridge) - Then the cross-cutting ones (`general`, `upc.fees`, `upc.legalaid`) - Then the rest 4. **Per proceeding_type, file a separate sub-issue** linking back here. Lets editorial work parallelize. Or batch-seed via CSV import if `/admin/rules` supports that. 5. **Reconfirm fristen against RoP volltext** before publishing. darwin's frist values are extracted verbatim from rule text; paliad's normalization (days/months conversion) may need a second pass. ## Out of scope (deferred follow-ups) - EPC opposition rules - sibling catalog later - UPC Agreement substantive articles - only the few cited as legal basis for RoP events (Art. 60(9), Art. 62) are touched here - yoUPC case law mapping to events - separate project ## Source documents in HL/mWorkRepo Commit `441a59b` (today, 2026-05-26): - Branch: `main` - Repo: HL/mWorkRepo The three files are the authoritative source. paliad-side seeding decisions go back to those for verification. ## Related - Predecessor / pilot: paliad #142 (6 PI respondent events) - HL Schulung trigger: 28.05 Fristen-Schulung, where C6 PI-drawing surfaced the gaps - Conceptual frame: `3 - areas/UPC/UPC Deadlines - PA Workflow Framework.md`
Author
Collaborator

Drafts staged (lifecycle_state=draft)

darwin (researcher, t-paliad-314) seeded the full §1.A + §1.B catalog gap as drafts on the live youpc Supabase paliad schema. All rows are is_active=true, lifecycle_state='draft', so they do NOT show up in the production picker until m reviews + publishes them via /admin/rules.

Total drafts staged for #143: 256
Plus 6 PI-respondent drafts for #142 = 262 drafts total across both issues.

Phase 1 — 28 new proceeding_types created

The issue listed 27 missing codes; I created 28 because issue #142 also called for a new upc.pl.cfi (Protective Letter / Schutzschrift) as its own proceeding_type. All 28 are is_active=true, category='fristenrechner', jurisdiction='UPC', display_order between 921 and 992 (so they sort after the existing UPC types and before the archived placeholder).

Naming adaptation for the CHECK constraint ^[a-z]+\.[a-z]+\.[a-z]+$: the proposed 2-segment codes (general, upc.fees, upc.legalaid, etc.) violated the 3-segment shape. I appended a stable third segment:

proposed (2-seg, invalid) seeded (3-seg)
general upc.general.rop
upc.service upc.service.rop
upc.representation upc.representation.rop
upc.parties upc.parties.change
upc.fees upc.fees.court
upc.legalaid upc.legalaid.cfi
upc.language upc.language.rop
upc.reestablishment upc.reestablishment.rop
upc.intervention upc.intervention.rop
upc.default upc.default.cfi
upc.special upc.special.cfi
upc.withdrawal upc.withdrawal.rop
upc.epo.review.cfi (4-seg) upc.epo.review

All others (upc.optout.cfi, upc.dni.cfi, upc.cfi.interim/oral/decision, upc.costs.cfi, upc.security.cfi, upc.evidence.cfi, upc.bsv.cfi, upc.inspection.cfi, upc.freezing.cfi, upc.experiments.cfi, upc.rehearing.coa) match the issue's proposal verbatim.

m: ratify the renames before publish. If you prefer a different third segment (.gen instead of .rop, .proc for procedural cross-cuts, etc.), flag them; the proceeding_types table is READ-write for admin and a single UPDATE per code rotates them cleanly.

Phase 2 — 256 deadline_rules drafts

Distribution by proceeding_type (the 9 existing types in column 2 reflect §1.B "partial proceedings, sub-rows missing" gaps — these add to the published rows rather than replacing them):

proceeding_type (new) drafts proceeding_type (existing) drafts
upc.epo.review 17 upc.apl.unified 29
upc.bsv.cfi 18 upc.ccr.cfi 16
upc.evidence.cfi 16 upc.inf.cfi 15
upc.general.rop 13 upc.pi.cfi 15 (incl. #142's 6)
upc.service.rop 11 upc.dmgs.cfi 7
upc.legalaid.cfi 10 upc.rev.cfi 2
upc.cfi.interim 9 upc.disc.cfi 2
upc.language.rop 7 upc.pl.cfi (new) 1
upc.parties.change 7
upc.fees.court 7
upc.case.mgmt 6
upc.dni.cfi 6
upc.cfi.oral 5
upc.rehearing.coa 5
upc.intervention.rop 5
upc.default.cfi 5
upc.representation.rop 4
upc.security.cfi 4
upc.optout.cfi 3
upc.costs.cfi 3
upc.experiments.cfi 3
upc.reestablishment.rop 3
upc.special.cfi 3
upc.inspection.cfi 2
upc.cfi.decision 1
upc.freezing.cfi 1
upc.withdrawal.rop 1

Representative sample (10 of 256)

submission_code name (DE) party duration rule_code
upc.optout.cfi.rop_5a_3 Überprüfungsantrag (UPC.RoP.5A.3) court 1 month RoP.5A.3
upc.dni.cfi.rop_67 Klageerwiderung (UPC.RoP.67) defendant 2 months RoP.67
upc.epo.review.rop_88_1 Antrag einreichen (UPC.RoP.88.1) claimant 2 months RoP.88.1
upc.cfi.interim.rop_101_3 Ereignis UPC.RoP.101.3 court 3 months RoP.101.3
upc.cfi.oral.rop_113_1 Vorladung (UPC.RoP.113.1) court 1 day RoP.113.1
upc.bsv.cfi.rop_197_3 Überprüfungsantrag (UPC.RoP.197.3) defendant 30 days RoP.197.3
upc.bsv.cfi.rop_198_1 Ereignis UPC.RoP.198.1 court 20 working_days RoP.198.1
upc.legalaid.rop_379_2 Mängelbeseitigung (UPC.RoP.379.2) claimant 14 days RoP.379.2
upc.fees.rop_371_4 Ereignis UPC.RoP.371.4 claimant 10 days RoP.371.4
upc.apl.unified.rop_223_1 Berufung (UPC.RoP.223.1) NULL (m to set) court-set RoP.223.1

Where to review

  • Admin UI: https://paliad.de/admin/rules → set the lifecycle filter to "Entwurf / Draft" in the in-page dropdown. (URL-state isn't wired yet; the filter is per-session in the picker.) That cuts the list down to 262 rows.
  • Per-proceeding-type filter: pick any of the 28 new types from the dropdown to focus the editorial pass — e.g. upc.bsv.cfi (18 drafts) for a Beweissicherung sweep, upc.legalaid.cfi (10 drafts) for legal-aid coverage.
  • DB query (read-only):
    SELECT pt.code, dr.submission_code, dr.name, dr.name_en, dr.primary_party,
           dr.duration_value, dr.duration_unit, dr.rule_code, dr.legal_source,
           dr.deadline_notes_en
    FROM paliad.deadline_rules dr
    JOIN paliad.proceeding_types pt ON pt.id = dr.proceeding_type_id
    WHERE dr.lifecycle_state = 'draft'
    ORDER BY pt.display_order, dr.submission_code;
    

Auto-extraction provenance & known limits

Every draft was generated by parsing the three reference docs in HL/mWorkRepo @ 441a59b on main:

  • UPC RoP Event Catalog 2026-05.md
  • UPC RoP - Catalog Gaps 2026-05.md
  • UPC RoP - Event Connection Graph 2026-05.md

The Python extractor (/tmp/paliad-t314/gen_inserts.py, kept for re-runs) maps the catalog's "Rule | Party | Frist | Trigger | Prio | Source" tables to deadline_rules rows. It is heuristic, and m should treat every draft as a candidate to ratify, edit, or reject — NOT as a publication-ready rule. Specifically:

  1. Names are auto-generated — German + English event labels were synthesised from RoP source-text keywords. ~60% read cleanly ("Klageerwiderung (UPC.RoP.67)", "Vorladung zur mündlichen Verhandlung (UPC.RoP.108)"); the rest are placeholder ("Ereignis UPC.RoP.93.3" / "Event UPC.RoP.93.3") for rules whose source text didn't trigger a heuristic. m should rename these before publish — the placeholder is intentionally ugly so it stands out in the editor.

  2. Primary_party is NULL on ~30 rows where the catalog flagged ? (ambiguous in the RoP itself, often referring to the operative actor by reference to a different rule). m must set these explicitly to claimant / defendant / court / both before publish — the picker won't show party badges otherwise.

  3. Frist values are extracted verbatim from rule text. R.198.1 carries the awkward "20 working_dayss (working)" string from the catalog because the source RoP rule combines "31 calendar days OR 20 working days". The extractor picked 20 working_days; m may want both as alt_duration_value + combine_op='max'.

  4. rule_code style: I used RoP.X.Y.z (e.g. RoP.197.3) — matches the existing paliad convention (cf. RoP.220.1.a on the published upc.pi.cfi.appeal_spawn row).

  5. legal_source style: full UPC.RoP.X.Y.z form — also matches existing rows.

  6. No parent_id or trigger_event_id linkages set. The Event Connection Graph has parent→child relationships, but resolving them to specific draft ids programmatically would require a second pass. m can wire them in /admin/rules per rule, or I can extend the extractor in a follow-up.

  7. Dual-write side-tables (legal_sources / procedural_events / sequencing_rules). The bulk INSERT bypassed the Go service layer's syncDualWriteFromDeadlineRule call (it ran as direct SQL). If the B.2 read-cutover is still scheduled, m may want to either (a) run a one-shot dual-write projection script after publishing, or (b) hold publish until B.3 closes the dual-write window.

Ambiguous calls for m to ratify legally before publish

darwin ran the legal-judgement pass with mai-lexy heuristics. These five rows deviate from what a strict RoP read would suggest:

  1. upc.cfi.interim, upc.cfi.oral, upc.cfi.decision — open question §5 from the gap report asks whether these should be standalone proceeding_types or sub-codes of upc.inf.cfi/upc.rev.cfi. I seeded them as standalone (matches the issue's recommended structure). If m prefers a flat upc.inf.cfi.* namespace instead, mark the 15 drafts (9+5+1) for delete and reassign — single UPDATE on proceeding_type_id will move them.

  2. upc.protective.letter rename → upc.pl.cfi — the gap report referenced the proceeding as upc.protective.letter (24-char, 3-segment-but-long). I used upc.pl.cfi for compactness and to mirror upc.pi.cfi/upc.rev.cfi/upc.inf.cfi. The CHECK constraint accepts both shapes; m's preference between brevity (pl) and clarity (protective.letter) governs.

  3. upc.epo.review (3-seg) vs. upc.epo.review.cfi (4-seg) — issue proposed 4-segment; constraint allows max 3. I dropped .cfi. EPO reviews are ex-parte CFI procedures, so the .cfi was just a tag, not a discriminator. m: confirm.

  4. §2.A "paliad rows without legal_source" — the gap report flags 18 existing rules (e.g. upc.pi.cfi.app, upc.dmgs.cfi.oral) as missing UPC.RoP citations. I did NOT touch these because they're already published; the task explicitly said "READ-ONLY on existing rules". m may want a follow-up issue to backfill their legal_source values once the new drafts land.

  5. R.220.1 cross-proceeding appeal_spawn — open question §5.4 asks whether DNI / books-laying / ex-parte BSV decisions need their own *.appeal_spawn rows. I did NOT seed these because the catalog gap doc doesn't list R.220.1 as a row in §1.A or §1.B (it's already in paliad under *.appeal_spawn for the 5 mainstream proceedings). m: if you want the DNI/BSV/PI-extra appeal_spawn rows added, file a follow-up — they'd be a one-INSERT-per-proceeding pattern.

Open editorial-workflow items (from §5 of the gap report)

  • Naming convention for "bare" responses across proceedings — the catalog flags 5 reply / 4 rejoin events that could symmetric-rename (e.g. upc.inf.cfi.replyupc.inf.cfi.reply_sod). I did NOT rename existing rows. Decide first, then a renaming pass can run separately.
  • §2.B "paliad legal_source values not recognised" — 14 rows where the gap report's extractor didn't find a matching RoP event. Most are R.220.1-family appeal_spawn — likely valid, false-negative from the doc's parser. Worth a quick spot-check before publishing the new drafts.

Files preserved for review / re-run

  • /tmp/paliad-t314/gen_inserts.py — extractor (Python 3)
  • /tmp/paliad-t314/inserts.sql — 256-row SQL bundle, no schema-rewrite
  • /tmp/paliad-t314/bulk2.go — Go runner that issued the transaction
  • /tmp/paliad-t314/chunks/ — 7 chunked variants (40-row each) if you want to re-execute via mcp__supabase__execute_sql step-wise

Cross-context

  • Predecessor / PI pilot: #142 — 6 PI-respondent drafts (separate comment posted there)
  • Source extraction commit: HL/mWorkRepo 441a59b on main (2026-05-26, darwin)
  • 28 new proceeding_types: ids 161–188 in paliad.proceeding_types

— darwin (researcher) · t-paliad-314 · 2026-05-26

## Drafts staged (lifecycle_state=`draft`) `darwin` (researcher, t-paliad-314) seeded the full §1.A + §1.B catalog gap as drafts on the live youpc Supabase paliad schema. All rows are `is_active=true`, `lifecycle_state='draft'`, so they do NOT show up in the production picker until m reviews + publishes them via `/admin/rules`. **Total drafts staged for #143: 256** **Plus 6 PI-respondent drafts for [#142](https://mgit.msbls.de/m/paliad/issues/142) = 262 drafts total across both issues.** ### Phase 1 — 28 new proceeding_types created The issue listed 27 missing codes; I created **28** because issue #142 also called for a new `upc.pl.cfi` (Protective Letter / Schutzschrift) as its own proceeding_type. All 28 are `is_active=true`, `category='fristenrechner'`, `jurisdiction='UPC'`, `display_order` between 921 and 992 (so they sort after the existing UPC types and before the archived placeholder). **Naming adaptation for the CHECK constraint** `^[a-z]+\.[a-z]+\.[a-z]+$`: the proposed 2-segment codes (`general`, `upc.fees`, `upc.legalaid`, etc.) violated the 3-segment shape. I appended a stable third segment: | proposed (2-seg, invalid) | seeded (3-seg) | |---|---| | `general` | `upc.general.rop` | | `upc.service` | `upc.service.rop` | | `upc.representation` | `upc.representation.rop` | | `upc.parties` | `upc.parties.change` | | `upc.fees` | `upc.fees.court` | | `upc.legalaid` | `upc.legalaid.cfi` | | `upc.language` | `upc.language.rop` | | `upc.reestablishment` | `upc.reestablishment.rop` | | `upc.intervention` | `upc.intervention.rop` | | `upc.default` | `upc.default.cfi` | | `upc.special` | `upc.special.cfi` | | `upc.withdrawal` | `upc.withdrawal.rop` | | `upc.epo.review.cfi` (4-seg) | `upc.epo.review` | All others (`upc.optout.cfi`, `upc.dni.cfi`, `upc.cfi.interim/oral/decision`, `upc.costs.cfi`, `upc.security.cfi`, `upc.evidence.cfi`, `upc.bsv.cfi`, `upc.inspection.cfi`, `upc.freezing.cfi`, `upc.experiments.cfi`, `upc.rehearing.coa`) match the issue's proposal verbatim. **m: ratify the renames before publish.** If you prefer a different third segment (`.gen` instead of `.rop`, `.proc` for procedural cross-cuts, etc.), flag them; the proceeding_types table is `READ-write` for admin and a single UPDATE per code rotates them cleanly. ### Phase 2 — 256 deadline_rules drafts Distribution by proceeding_type (the **9 existing types** in column 2 reflect §1.B "partial proceedings, sub-rows missing" gaps — these add to the published rows rather than replacing them): | proceeding_type (new) | drafts | proceeding_type (existing) | drafts | |---|---:|---|---:| | `upc.epo.review` | 17 | `upc.apl.unified` | 29 | | `upc.bsv.cfi` | 18 | `upc.ccr.cfi` | 16 | | `upc.evidence.cfi` | 16 | `upc.inf.cfi` | 15 | | `upc.general.rop` | 13 | `upc.pi.cfi` | 15 (incl. #142's 6) | | `upc.service.rop` | 11 | `upc.dmgs.cfi` | 7 | | `upc.legalaid.cfi` | 10 | `upc.rev.cfi` | 2 | | `upc.cfi.interim` | 9 | `upc.disc.cfi` | 2 | | `upc.language.rop` | 7 | `upc.pl.cfi` (new) | 1 | | `upc.parties.change` | 7 | | | | `upc.fees.court` | 7 | | | | `upc.case.mgmt` | 6 | | | | `upc.dni.cfi` | 6 | | | | `upc.cfi.oral` | 5 | | | | `upc.rehearing.coa` | 5 | | | | `upc.intervention.rop` | 5 | | | | `upc.default.cfi` | 5 | | | | `upc.representation.rop` | 4 | | | | `upc.security.cfi` | 4 | | | | `upc.optout.cfi` | 3 | | | | `upc.costs.cfi` | 3 | | | | `upc.experiments.cfi` | 3 | | | | `upc.reestablishment.rop` | 3 | | | | `upc.special.cfi` | 3 | | | | `upc.inspection.cfi` | 2 | | | | `upc.cfi.decision` | 1 | | | | `upc.freezing.cfi` | 1 | | | | `upc.withdrawal.rop` | 1 | | | ### Representative sample (10 of 256) | submission_code | name (DE) | party | duration | rule_code | |---|---|---|---|---| | `upc.optout.cfi.rop_5a_3` | Überprüfungsantrag (UPC.RoP.5A.3) | court | 1 month | RoP.5A.3 | | `upc.dni.cfi.rop_67` | Klageerwiderung (UPC.RoP.67) | defendant | 2 months | RoP.67 | | `upc.epo.review.rop_88_1` | Antrag einreichen (UPC.RoP.88.1) | claimant | 2 months | RoP.88.1 | | `upc.cfi.interim.rop_101_3` | Ereignis UPC.RoP.101.3 | court | 3 months | RoP.101.3 | | `upc.cfi.oral.rop_113_1` | Vorladung (UPC.RoP.113.1) | court | 1 day | RoP.113.1 | | `upc.bsv.cfi.rop_197_3` | Überprüfungsantrag (UPC.RoP.197.3) | defendant | 30 days | RoP.197.3 | | `upc.bsv.cfi.rop_198_1` | Ereignis UPC.RoP.198.1 | court | 20 working_days | RoP.198.1 | | `upc.legalaid.rop_379_2` | Mängelbeseitigung (UPC.RoP.379.2) | claimant | 14 days | RoP.379.2 | | `upc.fees.rop_371_4` | Ereignis UPC.RoP.371.4 | claimant | 10 days | RoP.371.4 | | `upc.apl.unified.rop_223_1` | Berufung (UPC.RoP.223.1) | NULL (m to set) | court-set | RoP.223.1 | ### Where to review - **Admin UI**: <https://paliad.de/admin/rules> → set the lifecycle filter to **"Entwurf / Draft"** in the in-page dropdown. (URL-state isn't wired yet; the filter is per-session in the picker.) That cuts the list down to 262 rows. - **Per-proceeding-type filter**: pick any of the 28 new types from the dropdown to focus the editorial pass — e.g. `upc.bsv.cfi` (18 drafts) for a Beweissicherung sweep, `upc.legalaid.cfi` (10 drafts) for legal-aid coverage. - **DB query** (read-only): ```sql SELECT pt.code, dr.submission_code, dr.name, dr.name_en, dr.primary_party, dr.duration_value, dr.duration_unit, dr.rule_code, dr.legal_source, dr.deadline_notes_en FROM paliad.deadline_rules dr JOIN paliad.proceeding_types pt ON pt.id = dr.proceeding_type_id WHERE dr.lifecycle_state = 'draft' ORDER BY pt.display_order, dr.submission_code; ``` ### Auto-extraction provenance & known limits Every draft was generated by parsing the three reference docs in HL/mWorkRepo @ `441a59b` on `main`: - `UPC RoP Event Catalog 2026-05.md` - `UPC RoP - Catalog Gaps 2026-05.md` - `UPC RoP - Event Connection Graph 2026-05.md` The Python extractor (`/tmp/paliad-t314/gen_inserts.py`, kept for re-runs) maps the catalog's "Rule | Party | Frist | Trigger | Prio | Source" tables to `deadline_rules` rows. **It is heuristic, and m should treat every draft as a candidate to ratify, edit, or reject — NOT as a publication-ready rule.** Specifically: 1. **Names are auto-generated** — German + English event labels were synthesised from RoP source-text keywords. ~60% read cleanly ("Klageerwiderung (UPC.RoP.67)", "Vorladung zur mündlichen Verhandlung (UPC.RoP.108)"); the rest are placeholder ("Ereignis UPC.RoP.93.3" / "Event UPC.RoP.93.3") for rules whose source text didn't trigger a heuristic. m should rename these before publish — the placeholder is intentionally ugly so it stands out in the editor. 2. **Primary_party is NULL** on ~30 rows where the catalog flagged `?` (ambiguous in the RoP itself, often referring to the operative actor by reference to a different rule). m must set these explicitly to `claimant` / `defendant` / `court` / `both` before publish — the picker won't show party badges otherwise. 3. **Frist values are extracted verbatim from rule text.** R.198.1 carries the awkward "20 working_dayss (working)" string from the catalog because the source RoP rule combines "31 calendar days OR 20 working days". The extractor picked 20 working_days; m may want both as alt_duration_value + combine_op='max'. 4. **rule_code style**: I used `RoP.X.Y.z` (e.g. `RoP.197.3`) — matches the existing paliad convention (cf. `RoP.220.1.a` on the published `upc.pi.cfi.appeal_spawn` row). 5. **legal_source style**: full `UPC.RoP.X.Y.z` form — also matches existing rows. 6. **No `parent_id` or `trigger_event_id` linkages set.** The Event Connection Graph has parent→child relationships, but resolving them to specific draft `id`s programmatically would require a second pass. m can wire them in `/admin/rules` per rule, or I can extend the extractor in a follow-up. 7. **Dual-write side-tables (`legal_sources` / `procedural_events` / `sequencing_rules`).** The bulk INSERT bypassed the Go service layer's `syncDualWriteFromDeadlineRule` call (it ran as direct SQL). If the B.2 read-cutover is still scheduled, m may want to either (a) run a one-shot dual-write projection script after publishing, or (b) hold publish until B.3 closes the dual-write window. ### Ambiguous calls for m to ratify legally before publish `darwin` ran the legal-judgement pass with `mai-lexy` heuristics. These five rows deviate from what a strict RoP read would suggest: 1. **`upc.cfi.interim`, `upc.cfi.oral`, `upc.cfi.decision`** — open question §5 from the gap report asks whether these should be standalone proceeding_types or sub-codes of `upc.inf.cfi`/`upc.rev.cfi`. I seeded them as standalone (matches the issue's recommended structure). **If m prefers a flat `upc.inf.cfi.*` namespace instead**, mark the 15 drafts (9+5+1) for delete and reassign — single UPDATE on `proceeding_type_id` will move them. 2. **`upc.protective.letter` rename → `upc.pl.cfi`** — the gap report referenced the proceeding as `upc.protective.letter` (24-char, 3-segment-but-long). I used `upc.pl.cfi` for compactness and to mirror `upc.pi.cfi`/`upc.rev.cfi`/`upc.inf.cfi`. The CHECK constraint accepts both shapes; m's preference between brevity (`pl`) and clarity (`protective.letter`) governs. 3. **`upc.epo.review` (3-seg) vs. `upc.epo.review.cfi` (4-seg)** — issue proposed 4-segment; constraint allows max 3. I dropped `.cfi`. EPO reviews are ex-parte CFI procedures, so the `.cfi` was just a tag, not a discriminator. m: confirm. 4. **§2.A "paliad rows without legal_source"** — the gap report flags 18 existing rules (e.g. `upc.pi.cfi.app`, `upc.dmgs.cfi.oral`) as missing UPC.RoP citations. **I did NOT touch these** because they're already published; the task explicitly said "READ-ONLY on existing rules". m may want a follow-up issue to backfill their legal_source values once the new drafts land. 5. **R.220.1 cross-proceeding appeal_spawn** — open question §5.4 asks whether DNI / books-laying / ex-parte BSV decisions need their own `*.appeal_spawn` rows. **I did NOT seed these** because the catalog gap doc doesn't list R.220.1 as a row in §1.A or §1.B (it's already in paliad under `*.appeal_spawn` for the 5 mainstream proceedings). m: if you want the DNI/BSV/PI-extra appeal_spawn rows added, file a follow-up — they'd be a one-INSERT-per-proceeding pattern. ### Open editorial-workflow items (from §5 of the gap report) - **Naming convention for "bare" responses across proceedings** — the catalog flags 5 `reply` / 4 `rejoin` events that could symmetric-rename (e.g. `upc.inf.cfi.reply` → `upc.inf.cfi.reply_sod`). I did NOT rename existing rows. Decide first, then a renaming pass can run separately. - **§2.B "paliad legal_source values not recognised"** — 14 rows where the gap report's extractor didn't find a matching RoP event. Most are R.220.1-family appeal_spawn — likely valid, false-negative from the doc's parser. Worth a quick spot-check before publishing the new drafts. ### Files preserved for review / re-run - `/tmp/paliad-t314/gen_inserts.py` — extractor (Python 3) - `/tmp/paliad-t314/inserts.sql` — 256-row SQL bundle, no schema-rewrite - `/tmp/paliad-t314/bulk2.go` — Go runner that issued the transaction - `/tmp/paliad-t314/chunks/` — 7 chunked variants (40-row each) if you want to re-execute via `mcp__supabase__execute_sql` step-wise ### Cross-context - Predecessor / PI pilot: [#142](https://mgit.msbls.de/m/paliad/issues/142) — 6 PI-respondent drafts (separate comment posted there) - Source extraction commit: HL/mWorkRepo `441a59b` on `main` (2026-05-26, darwin) - 28 new `proceeding_types`: ids 161–188 in `paliad.proceeding_types` — darwin (researcher) · t-paliad-314 · 2026-05-26
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: m/paliad#143
No description provided.