Bulletproof completeness audit: are all deadline rules covered? (researcher) #94

Open
opened 2026-05-25 13:09:16 +00:00 by mAi · 3 comments
Collaborator

m's report (2026-05-25 15:08)

And can we hire somehow to "bulletproof analyse" the completeness of deadlines in our system? Have we got all? All from our lists, all we find in the laws? This is a bigger job, needs an issue and a researcher.

Scope — completeness audit of paliad.deadline_rules

Methodically compare the deadline-rule catalog we have in the DB against the source-of-truth for each jurisdiction's procedural code. Identify gaps, redundancies, mis-attributed legal sources, mis-sequenced rules.

Jurisdictions in scope (per existing proceeding_types in paliad):

  • UPC — Unified Patent Court (CFI infringement, CCR revocation, CoA appeal, EPO opposition revision, etc.)
    • Source: UPC Rules of Procedure (Rules 12–393), UPC Agreement, UPC Statute
  • DPMA / German national courts
    • Source: PatG, ZPO, GebrMG; LG Klage, LG Berufung (OLG), Nichtigkeit (BPatG), Rechtsbeschwerde (BGH)
  • EPO — European Patent Office
    • Source: EPC + Implementing Regulations, Opposition (Art 99), Appeal (Art 106–109)
  • (Confirm with head if other jurisdictions in scope: national-route AT/CH? Italian / French / NL / UK national parts of the UPC opt-out world?)

What to do (researcher workflow)

Phase 1 — Inventory current state

  1. SELECT proceeding_type_id, count(*) FROM paliad.deadline_rules GROUP BY proceeding_type_id ORDER BY count(*) DESC — what coverage do we have per jurisdiction?
  2. Pull every rule + its legal_source, event_type, submission_code, period_value, period_unit, trigger_event_id for each proceeding_type. Dump to docs/research-deadlines-current-state-2026-05-25.md as a tabulated catalog.

Phase 2 — Audit against authoritative sources

For EACH proceeding_type:

  1. Read the relevant procedural code (online texts: UPC RoP at unifiedpatentcourt.org, EPC at epo.org, PatG / ZPO at gesetze-im-internet.de).
  2. Enumerate every deadline / time-limit / procedural step the statute defines.
  3. Cross-reference: for each enumerated item, does paliad have a matching rule? Match on legal_source citation + period + party_role.
  4. Flag:
    • Missing: statute defines it, paliad doesn't.
    • Misattributed legal source: paliad has the rule but the citation is wrong / outdated (e.g. a re-numbered section).
    • Wrong period: paliad says +2 months, statute says +3 months.
    • Wrong party_role: claimant/defendant misassigned.
    • Wrong sequencing: trigger_event_id points at a non-canonical anchor.
    • Duplicate: two rules cover the same statutory deadline.
  5. Note ambiguities (RoP refers to court discretion → paliad shouldn't have a hard period; sourcing decisions where the practice differs from the statute).

Phase 3 — Cross-check against firm lists

Confirm with head: m may have firm-internal checklists or other systems whose deadline catalogs should also be cross-referenced. If yes, ask head for pointers / paths.

Phase 4 — Deliverable: gap report

docs/research-deadlines-completeness-2026-05-25.md — sections:

  • §0 TL;DR (per-proceeding coverage % + total findings)
  • §1 Methodology (which sources consulted; date stamps for each)
  • §2 Current state inventory (per-jurisdiction tables)
  • §3 Findings — Missing (one section per jurisdiction)
  • §4 Findings — Misattributed legal source
  • §5 Findings — Wrong period
  • §6 Findings — Wrong party_role
  • §7 Findings — Wrong sequencing
  • §8 Findings — Duplicates
  • §9 Ambiguities (decisions m needs to make)
  • §10 Recommended fixes (prioritised — "add these N rules", "correct these M legal sources", etc.)
  • §11 Next-step proposals (slice these into trackable issues)

Each finding cites the statutory provision + the paliad rule (if exists) + the proposed fix.

Hard rules

  • READ-ONLY — researcher does NOT modify paliad.deadline_rules rows. Findings go in markdown.
  • Cite everything — every gap claim names the statutory provision (article + section + paragraph) with a date-stamped source URL.
  • No fabricated provisions — if uncertain about a statute, flag as "needs lawyer review" rather than guess. m can verify.
  • NO AskUserQuestion — researcher uses mai instruct head for any clarifying question (e.g. firm-list pointers, jurisdiction scope).
  • Branch: mai/<researcher>/deadlines-completeness-audit.
  • Time-cap recommendation: aim for thoroughness on UPC + DPMA + EPO; if time permits, audit secondary jurisdictions. Quality > breadth.
  • Don't propose to ship fixes — that's a separate task derived from this report. Findings + recommendations only.

Out of scope

  • Modifying paliad.deadline_rules (separate fix-task).
  • Adding new proceeding_types beyond audit observations (would be a separate design issue).
  • Comparing against competitors' systems (in case there's a benchmark someone wants).
  • Validating non-deadline procedural events (oral hearings, decisions) — those land in the procedural-events redesign (m/paliad#93).

Reporting

mai report completed with the doc path + branch + SHAs + the per-jurisdiction count summary in the body (e.g. "UPC: 14 currently in paliad / 17 in statute / 3 missing / 1 misattributed; DPMA: …"). m reviews; gap-fix tasks get filed separately from the report.

## m's report (2026-05-25 15:08) > And can we hire somehow to "bulletproof analyse" the completeness of deadlines in our system? Have we got all? All from our lists, all we find in the laws? This is a bigger job, needs an issue and a researcher. ## Scope — completeness audit of `paliad.deadline_rules` Methodically compare the deadline-rule catalog we have in the DB against the **source-of-truth** for each jurisdiction's procedural code. Identify gaps, redundancies, mis-attributed legal sources, mis-sequenced rules. Jurisdictions in scope (per existing proceeding_types in paliad): - **UPC** — Unified Patent Court (CFI infringement, CCR revocation, CoA appeal, EPO opposition revision, etc.) - Source: UPC Rules of Procedure (Rules 12–393), UPC Agreement, UPC Statute - **DPMA / German national courts** - Source: PatG, ZPO, GebrMG; LG Klage, LG Berufung (OLG), Nichtigkeit (BPatG), Rechtsbeschwerde (BGH) - **EPO** — European Patent Office - Source: EPC + Implementing Regulations, Opposition (Art 99), Appeal (Art 106–109) - **(Confirm with head if other jurisdictions in scope:** national-route AT/CH? Italian / French / NL / UK national parts of the UPC opt-out world?) ## What to do (researcher workflow) ### Phase 1 — Inventory current state 1. `SELECT proceeding_type_id, count(*) FROM paliad.deadline_rules GROUP BY proceeding_type_id ORDER BY count(*) DESC` — what coverage do we have per jurisdiction? 2. Pull every rule + its `legal_source`, `event_type`, `submission_code`, `period_value`, `period_unit`, `trigger_event_id` for each proceeding_type. Dump to `docs/research-deadlines-current-state-2026-05-25.md` as a tabulated catalog. ### Phase 2 — Audit against authoritative sources For EACH proceeding_type: 1. Read the relevant procedural code (online texts: UPC RoP at unifiedpatentcourt.org, EPC at epo.org, PatG / ZPO at gesetze-im-internet.de). 2. Enumerate every deadline / time-limit / procedural step the statute defines. 3. Cross-reference: for each enumerated item, does paliad have a matching rule? Match on legal_source citation + period + party_role. 4. Flag: - **Missing**: statute defines it, paliad doesn't. - **Misattributed legal source**: paliad has the rule but the citation is wrong / outdated (e.g. a re-numbered section). - **Wrong period**: paliad says +2 months, statute says +3 months. - **Wrong party_role**: claimant/defendant misassigned. - **Wrong sequencing**: trigger_event_id points at a non-canonical anchor. - **Duplicate**: two rules cover the same statutory deadline. 5. Note ambiguities (RoP refers to court discretion → paliad shouldn't have a hard period; sourcing decisions where the practice differs from the statute). ### Phase 3 — Cross-check against firm lists **Confirm with head**: m may have firm-internal checklists or other systems whose deadline catalogs should also be cross-referenced. If yes, ask head for pointers / paths. ### Phase 4 — Deliverable: gap report `docs/research-deadlines-completeness-2026-05-25.md` — sections: - §0 TL;DR (per-proceeding coverage % + total findings) - §1 Methodology (which sources consulted; date stamps for each) - §2 Current state inventory (per-jurisdiction tables) - §3 Findings — Missing (one section per jurisdiction) - §4 Findings — Misattributed legal source - §5 Findings — Wrong period - §6 Findings — Wrong party_role - §7 Findings — Wrong sequencing - §8 Findings — Duplicates - §9 Ambiguities (decisions m needs to make) - §10 Recommended fixes (prioritised — "add these N rules", "correct these M legal sources", etc.) - §11 Next-step proposals (slice these into trackable issues) Each finding cites the statutory provision + the paliad rule (if exists) + the proposed fix. ## Hard rules - **READ-ONLY** — researcher does NOT modify `paliad.deadline_rules` rows. Findings go in markdown. - **Cite everything** — every gap claim names the statutory provision (article + section + paragraph) with a date-stamped source URL. - **No fabricated provisions** — if uncertain about a statute, flag as "needs lawyer review" rather than guess. m can verify. - **NO AskUserQuestion** — researcher uses `mai instruct head` for any clarifying question (e.g. firm-list pointers, jurisdiction scope). - Branch: `mai/<researcher>/deadlines-completeness-audit`. - Time-cap recommendation: aim for thoroughness on UPC + DPMA + EPO; if time permits, audit secondary jurisdictions. Quality > breadth. - **Don't propose to ship fixes** — that's a separate task derived from this report. Findings + recommendations only. ## Out of scope - Modifying `paliad.deadline_rules` (separate fix-task). - Adding new proceeding_types beyond audit observations (would be a separate design issue). - Comparing against competitors' systems (in case there's a benchmark someone wants). - Validating non-deadline procedural events (oral hearings, decisions) — those land in the procedural-events redesign (m/paliad#93). ## Reporting `mai report completed` with the doc path + branch + SHAs + the per-jurisdiction count summary in the body (e.g. "UPC: 14 currently in paliad / 17 in statute / 3 missing / 1 misattributed; DPMA: …"). m reviews; gap-fix tasks get filed separately from the report.
mAi self-assigned this 2026-05-25 13:09:16 +00:00
Author
Collaborator

shift-1 complete (curie / t-paliad-263)

Deliverable: docs/research-deadlines-completeness-2026-05-25.md (956 lines) on branch mai/curie/researcher-bulletproof at SHA 94a9e7e.

Per-jurisdiction summary (live state queried 2026-05-25 14:00 UTC):

Jurisdiction Active types Rules Present-correct Wrong (duration) Wrong (anchor/seq) Wrong (citation) Court-set mismodelled Missing
UPC 9 67 ~45 3 (rev.defence/rejoin, apl.merits.response) 1 (pi.cfi.response) 5 (apl.merits.notice/grounds/response, rev.cfi.reply/rejoin) 0 ~21
EPA 3 23 ~16 0 2 (grant.exa.r71_3, .approval anchors) 0 1 (opp.opd.erwidg) 2 (R.135, Art.112a cap)
DPMA 3 13 ~7 0 0 2 (opp.dpma.erwiderung, appeal.bpatg.begruendung) 2 (same two) 0
DE 5 29 ~10 0 2 (de.inf.lg.beruf_begr anchor + replik/duplik parent_id) 4 (de.null.bpatg.erwidg 82.1->82.3; de.null.bgh.begr/erwid 111.x; …) 3 (de.inf.olg.erwiderung, de.null.bgh.erwiderung, de.null.bpatg.duplik) 5 (Wiedereinsetzung, Versäumnis, Schriftsatznachreichung, etc.)
Total 20 132 78 (59%) 3 (2%) 5 (4%) 11 (8%) 6 (5%) ~30

Top 5 user-visible bugs (ship in Wave 0 — proposed t-paliad-264):

  1. 🔴 upc.rev.cfi.defence — 3mo, should be 2mo per RoP.49.1 (verified verbatim from UPCRoP.049.1 youpc DB). Flagged 2026-05-08; still live.
  2. 🔴 upc.rev.cfi.rejoin — 2mo, should be 1mo per RoP.52. Flagged 2026-05-08; still live.
  3. 🟠 upc.apl.merits.response — 2mo, should be 3mo per RoP.235.1. New (May 8 audit recorded 3mo but live data has always been 2 since mig 012).
  4. 🟠 de.inf.lg.beruf_begr — chains parent=berufung → effective 3mo from urteil; per ZPO §520(2) should be 2mo from urteil-service. Fix: parent_id=NULL.
  5. 🟠 de.inf.lg.replik + .duplik — both have parent_id=NULL so they fire on the trigger date (= Klageerhebung) BEFORE the Klageerwiderung. Fix: chain Replik→Erwidg, Duplik→Replik, mark both is_court_set=true. (This is the bug head flagged at 13:13.)

Plus 11 citation drift + 6 court-set mismodelling fixes in §10 Tier 0 (16 single-row UPDATEs total).

Closed since May 8: R.19 Preliminary Objection (both UPC_INF & UPC_REV) and R.220.1(a) merits-appeal spawn — all via mig 095.

Open ambiguities for m (§9 Q1-Q13): court-set vs fixed-period policy for richterliche Fristen (Q1), R.198/R.213 working-days primitive (Q2), R.245 outer-cap arithmetic (Q3-Q4), Wiedereinsetzung modelling (Q5-Q6), GebrMG scope (Q10), proceeding-tree↔cascade parity (Q11), R.220.3 anchor (Q12), cross-proc spawn wiring (Q13).

Slicing proposal: §11 decomposes the 41 fixes into Wave 0 → Wave 6 fix-tasks (t-paliad-264 through -278). Wave 0 is the only urgent one — the 5 calendar-correctness bugs above are live in prod today.

Awaiting m's review of §9 Q1-Q13 + Tier 0 sign-off before Wave 0 gets cut.

## shift-1 complete (curie / t-paliad-263) **Deliverable:** `docs/research-deadlines-completeness-2026-05-25.md` (956 lines) on branch `mai/curie/researcher-bulletproof` at SHA `94a9e7e`. **Per-jurisdiction summary (live state queried 2026-05-25 14:00 UTC):** | Jurisdiction | Active types | Rules | Present-correct | Wrong (duration) | Wrong (anchor/seq) | Wrong (citation) | Court-set mismodelled | Missing | |---|---:|---:|---:|---:|---:|---:|---:|---:| | UPC | 9 | 67 | ~45 | 3 (rev.defence/rejoin, apl.merits.response) | 1 (pi.cfi.response) | 5 (apl.merits.notice/grounds/response, rev.cfi.reply/rejoin) | 0 | ~21 | | EPA | 3 | 23 | ~16 | 0 | 2 (grant.exa.r71_3, .approval anchors) | 0 | 1 (opp.opd.erwidg) | 2 (R.135, Art.112a cap) | | DPMA | 3 | 13 | ~7 | 0 | 0 | 2 (opp.dpma.erwiderung, appeal.bpatg.begruendung) | 2 (same two) | 0 | | DE | 5 | 29 | ~10 | 0 | 2 (de.inf.lg.beruf_begr anchor + replik/duplik parent_id) | 4 (de.null.bpatg.erwidg 82.1->82.3; de.null.bgh.begr/erwid 111.x; …) | 3 (de.inf.olg.erwiderung, de.null.bgh.erwiderung, de.null.bpatg.duplik) | 5 (Wiedereinsetzung, Versäumnis, Schriftsatznachreichung, etc.) | | **Total** | **20** | **132** | **78 (59%)** | **3 (2%)** | **5 (4%)** | **11 (8%)** | **6 (5%)** | **~30** | **Top 5 user-visible bugs (ship in Wave 0 — proposed t-paliad-264):** 1. 🔴 `upc.rev.cfi.defence` — 3mo, should be 2mo per RoP.49.1 (verified verbatim from `UPCRoP.049.1` youpc DB). Flagged 2026-05-08; still live. 2. 🔴 `upc.rev.cfi.rejoin` — 2mo, should be 1mo per RoP.52. Flagged 2026-05-08; still live. 3. 🟠 `upc.apl.merits.response` — 2mo, should be 3mo per RoP.235.1. New (May 8 audit recorded 3mo but live data has always been 2 since mig 012). 4. 🟠 `de.inf.lg.beruf_begr` — chains parent=berufung → effective 3mo from urteil; per ZPO §520(2) should be 2mo from urteil-service. Fix: `parent_id=NULL`. 5. 🟠 `de.inf.lg.replik` + `.duplik` — both have `parent_id=NULL` so they fire on the trigger date (= Klageerhebung) BEFORE the Klageerwiderung. Fix: chain Replik→Erwidg, Duplik→Replik, mark both `is_court_set=true`. (This is the bug head flagged at 13:13.) **Plus 11 citation drift + 6 court-set mismodelling fixes** in §10 Tier 0 (16 single-row UPDATEs total). **Closed since May 8:** R.19 Preliminary Objection (both UPC_INF & UPC_REV) and R.220.1(a) merits-appeal spawn — all via mig 095. **Open ambiguities for m (§9 Q1-Q13):** court-set vs fixed-period policy for richterliche Fristen (Q1), R.198/R.213 working-days primitive (Q2), R.245 outer-cap arithmetic (Q3-Q4), Wiedereinsetzung modelling (Q5-Q6), GebrMG scope (Q10), proceeding-tree↔cascade parity (Q11), R.220.3 anchor (Q12), cross-proc spawn wiring (Q13). **Slicing proposal:** §11 decomposes the 41 fixes into Wave 0 → Wave 6 fix-tasks (t-paliad-264 through -278). Wave 0 is the only urgent one — the 5 calendar-correctness bugs above are live in prod today. Awaiting m's review of §9 Q1-Q13 + Tier 0 sign-off before Wave 0 gets cut.
Author
Collaborator

Cross-ref from t-paliad-264 / #95: shipped the de.inf.lg sequencing fix as a single Wave 0 candidate ahead of the broader audit deliverable.

Migration 123 (internal/db/migrations/123_de_inf_lg_replik_duplik_sequencing.up.sql, commit f45ad50) repoints:

  • de.inf.lg.replik parent_id → de.inf.lg.erwidg (was NULL)
  • de.inf.lg.duplik parent_id → de.inf.lg.replik (was NULL)

Both marked is_court_set = true, legal_source = 'DE.ZPO.273', with deadline_notes citing §§ 273, 282 ZPO. 4-week placeholder duration retained so the timeline renders distinct dates the lawyer can override via "Datum setzen".

Applied to live DB; paliad.applied_migrations at 123/122 rows.

For the audit: this is one "Wrong sequencing" finding for §7 — "Replik / Duplik DE LG had parent_id=NULL so they collided on the trigger date and rendered before Klageerwiderung. Fixed by anchoring on the preceding filing and flagging is_court_set."

Adjacent residual gotcha worth noting in the audit (not fixing here — out of #95 scope): the fristenrechner's Calculate walk does not propagate r.IsCourtSet → d.IsCourtSet for rules with duration_value > 0. So Klageerwiderung (is_court_set=true, dur=6w) and the freshly-fixed Replik/Duplik (is_court_set=true, dur=4w) all render as plain "predicted" rows in the SmartTimeline without the dashed court-set border. Worth a §10 line item: lift the courtSet[r.ID] = true + d.IsCourtSet = true assignment out of the dur==0 branch in internal/services/fristenrechner.go so the flag is honoured uniformly.

Cross-ref from t-paliad-264 / #95: shipped the **de.inf.lg sequencing fix** as a single Wave 0 candidate ahead of the broader audit deliverable. Migration 123 (`internal/db/migrations/123_de_inf_lg_replik_duplik_sequencing.up.sql`, commit f45ad50) repoints: - `de.inf.lg.replik` parent_id → `de.inf.lg.erwidg` (was NULL) - `de.inf.lg.duplik` parent_id → `de.inf.lg.replik` (was NULL) Both marked `is_court_set = true`, `legal_source = 'DE.ZPO.273'`, with `deadline_notes` citing §§ 273, 282 ZPO. 4-week placeholder duration retained so the timeline renders distinct dates the lawyer can override via "Datum setzen". Applied to live DB; `paliad.applied_migrations` at 123/122 rows. For the audit: this is one **"Wrong sequencing"** finding for §7 — "Replik / Duplik DE LG had parent_id=NULL so they collided on the trigger date and rendered before Klageerwiderung. Fixed by anchoring on the preceding filing and flagging `is_court_set`." Adjacent residual gotcha worth noting in the audit (not fixing here — out of #95 scope): the fristenrechner's `Calculate` walk does **not** propagate `r.IsCourtSet → d.IsCourtSet` for rules with `duration_value > 0`. So Klageerwiderung (is_court_set=true, dur=6w) and the freshly-fixed Replik/Duplik (is_court_set=true, dur=4w) all render as plain "predicted" rows in the SmartTimeline without the dashed court-set border. Worth a §10 line item: lift the `courtSet[r.ID] = true + d.IsCourtSet = true` assignment out of the dur==0 branch in `internal/services/fristenrechner.go` so the flag is honoured uniformly.
Author
Collaborator

Wave 0 shipped on branch mai/brunel/wave0-tier0-deadline-fixes @ 05f7ea2.

Migration 127 (internal/db/migrations/127_wave0_tier0_deadline_fixes.up.sql, ~480 LoC) lands the Tier 0 sweep from §10 of this audit. 13 distinct row UPDATEs plus the UPC SoC citation from m/paliad#99 — single migration file.

Rows touched:

# Rule Change
T0.1 upc.rev.cfi.defence dur 3mo→2mo, rule_code zero-pad RoP.049.1
T0.2 upc.rev.cfi.rejoin dur 2mo→1mo, citation RoP.052 / UPC.RoP.52
T0.3 upc.apl.merits.response dur 2mo→3mo, citation RoP.235.1
T0.4 de.inf.lg.beruf_begr parent_id berufung→NULL (ZPO §520(2))
T0.7 upc.rev.cfi.reply citation backfill RoP.051
T0.9 upc.apl.merits.notice citation RoP.220.1 → RoP.224.1.a
T0.10 upc.apl.merits.grounds citation RoP.220.1 → RoP.224.2.a
T0.12 dpma.opp.dpma.erwiderung flip is_court_set, drop PatG §59(3)
T0.13 dpma.appeal.bpatg.begruendung flip is_court_set, drop PatG §75(1)
T0.14 de.null.bpatg.erwidg citation PatG §82.1 → §82.3
T0.15 de.null.bgh.begruendung citation PatG §111 → ZPO §520(2) via PatG §117
T0.16 de.null.bgh.erwiderung flip is_court_set + recite ZPO §521(2) via §117
T0.17 epa.opp.opd.erwidg flip is_court_set (EPO Guidelines D-IV 5.2)
#99 upc.inf.cfi.soc backfill UPC RoP R.13(1) citation

T0.5 / T0.6 (de.inf.lg.replik / .duplik) shipped separately as mig 124 (#95) — not repeated here. T0.8 dedup'd into T0.2 and T0.11 dedup'd into T0.1, per the audit doc's own note.

Idempotency: each UPDATE is guarded by a WHERE clause matching only the pre-fix row state (mig 095 convention). Re-apply against a DB carrying the fix matches zero rows and no-ops — no duplicate deadline_rule_audit entries on idempotent re-runs. Verification DO 2003554 block at the end RAISEs EXCEPTION if any row remains in inconsistent state.

Applied to live youpc DB via Supabase MCP with audit_reason set; all 14 touched rows verified in post-fix shape via direct query. applied_migrations row NOT pre-recorded; the boot-time runner inserts version=127 cleanly on next deploy because every guarded UPDATE no-ops at that point.

Build hygiene: go build ./..., go test ./internal/..., bun run build all clean (2824 i18n keys, no scan warnings). No code changes — pure data migration.

NOT self-merged. Awaiting maria's merge gate.

**Wave 0 shipped** on branch `mai/brunel/wave0-tier0-deadline-fixes` @ 05f7ea2. **Migration 127** (`internal/db/migrations/127_wave0_tier0_deadline_fixes.up.sql`, ~480 LoC) lands the Tier 0 sweep from §10 of this audit. 13 distinct row UPDATEs plus the UPC SoC citation from m/paliad#99 — single migration file. **Rows touched**: | # | Rule | Change | |---|---|---| | T0.1 | `upc.rev.cfi.defence` | dur 3mo→2mo, rule_code zero-pad RoP.049.1 | | T0.2 | `upc.rev.cfi.rejoin` | dur 2mo→1mo, citation RoP.052 / UPC.RoP.52 | | T0.3 | `upc.apl.merits.response` | dur 2mo→3mo, citation RoP.235.1 | | T0.4 | `de.inf.lg.beruf_begr` | parent_id berufung→NULL (ZPO §520(2)) | | T0.7 | `upc.rev.cfi.reply` | citation backfill RoP.051 | | T0.9 | `upc.apl.merits.notice` | citation RoP.220.1 → RoP.224.1.a | | T0.10 | `upc.apl.merits.grounds` | citation RoP.220.1 → RoP.224.2.a | | T0.12 | `dpma.opp.dpma.erwiderung` | flip is_court_set, drop PatG §59(3) | | T0.13 | `dpma.appeal.bpatg.begruendung` | flip is_court_set, drop PatG §75(1) | | T0.14 | `de.null.bpatg.erwidg` | citation PatG §82.1 → §82.3 | | T0.15 | `de.null.bgh.begruendung` | citation PatG §111 → ZPO §520(2) via PatG §117 | | T0.16 | `de.null.bgh.erwiderung` | flip is_court_set + recite ZPO §521(2) via §117 | | T0.17 | `epa.opp.opd.erwidg` | flip is_court_set (EPO Guidelines D-IV 5.2) | | #99 | `upc.inf.cfi.soc` | backfill UPC RoP R.13(1) citation | T0.5 / T0.6 (de.inf.lg.replik / .duplik) shipped separately as mig 124 (#95) — not repeated here. T0.8 dedup'd into T0.2 and T0.11 dedup'd into T0.1, per the audit doc's own note. **Idempotency**: each UPDATE is guarded by a `WHERE` clause matching only the pre-fix row state (mig 095 convention). Re-apply against a DB carrying the fix matches zero rows and no-ops — no duplicate `deadline_rule_audit` entries on idempotent re-runs. Verification `DO 2003554` block at the end RAISEs EXCEPTION if any row remains in inconsistent state. **Applied to live youpc DB** via Supabase MCP with `audit_reason` set; all 14 touched rows verified in post-fix shape via direct query. `applied_migrations` row NOT pre-recorded; the boot-time runner inserts version=127 cleanly on next deploy because every guarded UPDATE no-ops at that point. **Build hygiene**: `go build ./...`, `go test ./internal/...`, `bun run build` all clean (2824 i18n keys, no scan warnings). No code changes — pure data migration. NOT self-merged. Awaiting maria's merge gate.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: m/paliad#94
No description provided.