Fristenrechner: forum & inbox-channel pre-filter (CMS / beA / Posteingang) #15

Open
opened 2026-05-08 13:53:12 +00:00 by mAi · 5 comments
Collaborator

Most users live in either national German or UPC world — let them set that once and have the whole tool narrow accordingly. Inbox channels (CMS / beA / Posteingang) are a natural shortcut for picking the forum:

  • CMS arrives only at UPC.
  • beA arrives only at national German courts.
  • Posteingang can be either, but is mostly national.

m clarification (2026-05-08): channel does NOT change deadline math. § 41a-style 3-day-Eingangsfiktion or similar rules are not modeled here. The channel selector is purely a forum/proceeding-narrowing UX shortcut — picking CMS auto-narrows to UPC, picking beA auto-narrows to national-DE.

Scope

  • Persisted user preference (decide in impl: paliad.user_preferences row, or local-storage; cross-device matters).
  • Pre-filter on landing / sidebar that narrows downstream surfaces:
    • Pathway A proceeding picker
    • B1 cascade
    • B2 search results
  • Inbox-channel chip on the trigger row + B1 cascade entry: "Wo kam es an?" → CMS / beA / Posteingang. Picking CMS auto-narrows to UPC; picking beA auto-narrows to national-DE.
  • Reset / "show everything" affordance for cross-jurisdiction sessions.

Out of scope

  • Deadline-math impact of the channel (m confirmed: not relevant here).

Context

t-paliad-157 items 5 + 6.

Most users live in either national German or UPC world — let them set that once and have the whole tool narrow accordingly. Inbox channels (CMS / beA / Posteingang) are a natural shortcut for picking the forum: - CMS arrives only at UPC. - beA arrives only at national German courts. - Posteingang can be either, but is mostly national. m clarification (2026-05-08): channel does NOT change deadline math. § 41a-style 3-day-Eingangsfiktion or similar rules are not modeled here. The channel selector is purely a forum/proceeding-narrowing UX shortcut — picking CMS auto-narrows to UPC, picking beA auto-narrows to national-DE. ## Scope - Persisted user preference (decide in impl: `paliad.user_preferences` row, or local-storage; cross-device matters). - Pre-filter on landing / sidebar that narrows downstream surfaces: - Pathway A proceeding picker - B1 cascade - B2 search results - Inbox-channel chip on the trigger row + B1 cascade entry: "Wo kam es an?" → CMS / beA / Posteingang. Picking CMS auto-narrows to UPC; picking beA auto-narrows to national-DE. - Reset / "show everything" affordance for cross-jurisdiction sessions. ## Out of scope - Deadline-math impact of the channel (m confirmed: not relevant here). ## Context t-paliad-157 items 5 + 6.
Author
Collaborator

First two slices on mai/feynman/fristenrechner:

  • 06bd276 — Schema + backend wiring. Migration 064 adds paliad.users.forum_pref (text, CHECK enum: cms, bea, posteingang), wires it through models.User, the userColumns SELECT, and UpdateProfileInput. Empty string clears (matches EscalationContactID convention). isValidForumPref mirrors the DB CHECK so callers see typed errors. Migration applied live; tracker at v64.
  • 1df1bc7 — Frontend chip strip on /tools/fristenrechner + filter on Pathway A picker. Three chips (CMS, beA, Posteingang) plus an "Alle" reset. State priority: URL ?inbox=/api/me saved pref → unset. Click writes URL, applies filter (hides non-matching .proceeding-group via new data-forum attributes), and PATCHes /api/me opportunistically. 6 new i18n keys (DE+EN) under deadlines.inbox.*. CSS bound to existing token palette.

Mapping: CMS → UPC; beA / Posteingang → national-DE. EPA / DPMA fall out when a chip is active; users reach them via the existing B2 search or by clearing the chip.

Untouched (orthogonal to this slice):

  • B2's 10-bucket fine-grained forum chip set further down the page (different problem).
  • B1 cascade entry-point narrowing — could share the same forum_pref later.

Hard rules respected: not self-merged, NOT cronus, no RAISE EXCEPTION, only existing CSS tokens.

First two slices on `mai/feynman/fristenrechner`: - **[`06bd276`](https://mgit.msbls.de/m/paliad/commit/06bd276)** — Schema + backend wiring. Migration 064 adds `paliad.users.forum_pref` (text, CHECK enum: `cms`, `bea`, `posteingang`), wires it through `models.User`, the `userColumns` SELECT, and `UpdateProfileInput`. Empty string clears (matches EscalationContactID convention). `isValidForumPref` mirrors the DB CHECK so callers see typed errors. Migration applied live; tracker at v64. - **[`1df1bc7`](https://mgit.msbls.de/m/paliad/commit/1df1bc7)** — Frontend chip strip on `/tools/fristenrechner` + filter on Pathway A picker. Three chips (CMS, beA, Posteingang) plus an "Alle" reset. State priority: URL `?inbox=` → `/api/me` saved pref → unset. Click writes URL, applies filter (hides non-matching `.proceeding-group` via new `data-forum` attributes), and PATCHes `/api/me` opportunistically. 6 new i18n keys (DE+EN) under `deadlines.inbox.*`. CSS bound to existing token palette. Mapping: CMS → UPC; beA / Posteingang → national-DE. EPA / DPMA fall out when a chip is active; users reach them via the existing B2 search or by clearing the chip. Untouched (orthogonal to this slice): - B2's 10-bucket fine-grained forum chip set further down the page (different problem). - B1 cascade entry-point narrowing — could share the same forum_pref later. Hard rules respected: not self-merged, NOT cronus, no `RAISE EXCEPTION`, only existing CSS tokens.
Author
Collaborator

Slice 3 pushed: e879298 — inbox chip now drives the existing B2 fine-bucket forum filter (activeForums). Picking CMS auto-selects upc_cfi + upc_coa; picking beA / Posteingang auto-selects all four DE buckets (de_lg, de_olg, de_bgh, de_bpatg); "Alle" clears both.

State-priority discipline keeps URL shares honest:

  • User click — always replaces activeForums with the inbox-derived set.
  • Hydrate — derives only when URL ?forum= is empty. An explicit ?forum= wins over the saved pref so a CMS-narrowed share link still works for a recipient with a different default.
  • popstate — re-applies the same rule on browser back/forward.

What's covered by #15 now:

  • paliad.users.forum_pref schema + service + PATCH /api/me wiring.
  • Page-top chip strip on /tools/fristenrechner with persistence + URL ?inbox= override.
  • Pathway A picker filter (hides non-matching .proceeding-group via data-forum).
  • B2 fine-bucket pre-narrowing.

What's deferred (worth a follow-up):

  • B1 cascade entry-point narrowing. event_categories has no jurisdiction/forum metadata column today, so narrowing the cascade root branches by inbox would either need a heuristic on slug patterns (.upc-, .de-, .epa-, .dpma- suffixes) or a small migration adding a forums text[] column. Heuristic is brittle; migration is cleaner. Not in scope here — happy to file as a follow-up issue or fold into #16's IA-reframe work since it overlaps with the cascade restructure.

Branch on mai/feynman/fristenrechner ready for head merge.

Slice 3 pushed: **[`e879298`](https://mgit.msbls.de/m/paliad/commit/e879298)** — inbox chip now drives the existing B2 fine-bucket forum filter (`activeForums`). Picking CMS auto-selects upc_cfi + upc_coa; picking beA / Posteingang auto-selects all four DE buckets (de_lg, de_olg, de_bgh, de_bpatg); "Alle" clears both. State-priority discipline keeps URL shares honest: - **User click** — always replaces `activeForums` with the inbox-derived set. - **Hydrate** — derives only when URL `?forum=` is empty. An explicit `?forum=` wins over the saved pref so a CMS-narrowed share link still works for a recipient with a different default. - **popstate** — re-applies the same rule on browser back/forward. What's covered by #15 now: - [x] `paliad.users.forum_pref` schema + service + PATCH /api/me wiring. - [x] Page-top chip strip on `/tools/fristenrechner` with persistence + URL `?inbox=` override. - [x] Pathway A picker filter (hides non-matching `.proceeding-group` via `data-forum`). - [x] B2 fine-bucket pre-narrowing. What's deferred (worth a follow-up): - [ ] **B1 cascade entry-point narrowing.** event_categories has no jurisdiction/forum metadata column today, so narrowing the cascade root branches by inbox would either need a heuristic on slug patterns (`.upc-`, `.de-`, `.epa-`, `.dpma-` suffixes) or a small migration adding a `forums text[]` column. Heuristic is brittle; migration is cleaner. Not in scope here — happy to file as a follow-up issue or fold into #16's IA-reframe work since it overlaps with the cascade restructure. Branch on `mai/feynman/fristenrechner` ready for head merge.
Author
Collaborator

B1 follow-up shipped: 6ef14dd — inbox chip now narrows the B1 decision tree alongside Pathway A and B2.

Migration 065 adds paliad.event_categories.forums text[] (CHECK on {upc, de, epa, dpma}, partial GIN index) plus a two-step backfill:

  1. Regex on slug for nodes carrying the forum token explicitly (upc-, .upc, -upc, .de-, -de-, epa, dpma). Token-bounded so .dpma doesn't trip the de rule.
  2. Explicit slug list for stragglers — BGH / BPatG / Versäumnisurteil / Hinweisbeschluss are DE-only; r116-eingaben is EPA-only.

NULL stays neutral. Top-level branches, Mündliche Verhandlung sub-states, and court-generic events (Ladung, Kostenfestsetzung, Anordnung) intentionally stay reachable from every chip setting so the cross-jurisdictional middle of the cascade remains accessible. Mig applied live; tracker at v65.

Frontend: EventCategoryNode.forums? exposed in the tree JSON; applyInboxFilter re-renders the cascade in place when the chip changes; inboxFilterAllowsForums(forums) gates each child render — neutral nodes always pass.

#15 acceptance now complete:

  • paliad.users.forum_pref schema + service + PATCH /api/me wiring.
  • Page-top chip strip on /tools/fristenrechner with persistence + URL ?inbox= override.
  • Pathway A picker filter via data-forum.
  • B2 fine-bucket pre-narrowing.
  • B1 cascade narrowing via paliad.event_categories.forums.

Branch on mai/feynman/fristenrechner (4 commits ahead), ready for merge.

B1 follow-up shipped: **[`6ef14dd`](https://mgit.msbls.de/m/paliad/commit/6ef14dd)** — inbox chip now narrows the B1 decision tree alongside Pathway A and B2. Migration 065 adds `paliad.event_categories.forums text[]` (CHECK on `{upc, de, epa, dpma}`, partial GIN index) plus a two-step backfill: 1. Regex on slug for nodes carrying the forum token explicitly (`upc-`, `.upc`, `-upc`, `.de-`, `-de-`, `epa`, `dpma`). Token-bounded so `.dpma` doesn't trip the `de` rule. 2. Explicit slug list for stragglers — BGH / BPatG / Versäumnisurteil / Hinweisbeschluss are DE-only; `r116-eingaben` is EPA-only. NULL stays neutral. Top-level branches, Mündliche Verhandlung sub-states, and court-generic events (Ladung, Kostenfestsetzung, Anordnung) intentionally stay reachable from every chip setting so the cross-jurisdictional middle of the cascade remains accessible. Mig applied live; tracker at v65. Frontend: `EventCategoryNode.forums?` exposed in the tree JSON; `applyInboxFilter` re-renders the cascade in place when the chip changes; `inboxFilterAllowsForums(forums)` gates each child render — neutral nodes always pass. #15 acceptance now complete: - [x] `paliad.users.forum_pref` schema + service + PATCH /api/me wiring. - [x] Page-top chip strip on `/tools/fristenrechner` with persistence + URL `?inbox=` override. - [x] Pathway A picker filter via `data-forum`. - [x] B2 fine-bucket pre-narrowing. - [x] B1 cascade narrowing via `paliad.event_categories.forums`. Branch on `mai/feynman/fristenrechner` (4 commits ahead), ready for merge.
Author
Collaborator

Two follow-up slices on mai/feynman/fristenrechner from m's 2026-05-08 17:50 feedback:

  • ac15911 — moved the inbox-channel chip out of the page header and into the B1 panel (above the cascade). Pathway A's Verlauf no longer filters on inbox — m's call: "Verlauf does not need to see that". B2 fine-bucket sync stays (B2 lives inside the Determinator). The data-forum attributes stay on the picker markup as documentation but no longer drive visibility.
  • ef78f59 — RoP.151-style rules (real duration chained off a court-set parent) now render "unbestimmt" instead of "wird vom Gericht bestimmt". Direct court-set events (Urteil / Beschluss / Anordnung) keep the original label. New IsCourtSetIndirect flag on UIDeadline distinguishes the two cases; same split applied in the save-modal label.

Items 2 + 4 from the batch (optional deadlines, more opponent-side proceeding types + role variants) remain open. Ready to take whichever m wants next.

Two follow-up slices on `mai/feynman/fristenrechner` from m's 2026-05-08 17:50 feedback: - **[`ac15911`](https://mgit.msbls.de/m/paliad/commit/ac15911)** — moved the inbox-channel chip out of the page header and into the B1 panel (above the cascade). Pathway A's Verlauf no longer filters on inbox — m's call: "Verlauf does not need to see that". B2 fine-bucket sync stays (B2 lives inside the Determinator). The `data-forum` attributes stay on the picker markup as documentation but no longer drive visibility. - **[`ef78f59`](https://mgit.msbls.de/m/paliad/commit/ef78f59)** — RoP.151-style rules (real duration chained off a court-set parent) now render **"unbestimmt"** instead of "wird vom Gericht bestimmt". Direct court-set events (Urteil / Beschluss / Anordnung) keep the original label. New `IsCourtSetIndirect` flag on UIDeadline distinguishes the two cases; same split applied in the save-modal label. Items 2 + 4 from the batch (optional deadlines, more opponent-side proceeding types + role variants) remain open. Ready to take whichever m wants next.
Author
Collaborator

Item 4 shipped: fdbbc74 — migration 069 adds 5 new opponent-side parent nodes + 17 leaves under cms-eingang.gegenseite:

  • upc-app (UPC Berufungsverfahren) — Berufungsschrift, -begründung, -erwiderung, Anschlussberufung (R.237), Erwiderung Anschlussberufung (R.238).
  • upc-pi (UPC einstweilige Maßnahmen) — Antrag, Erwiderung.
  • de-bgh-inf (DE Revision / NZB BGH (Verletzung)) — NZB, NZB-Begründung, Revisionsschrift, Revisionsbegründung, Revisionserwiderung.
  • de-bgh-null (DE Berufung BGH (Nichtigkeit)) — Berufungsschrift, -begründung, -erwiderung.
  • dpma-bgh (DPMA Rechtsbeschwerde BGH) — Rechtsbeschwerde, RB-Begründung.

Each leaf wires to the existing deadline_concepts (notice-of-appeal, statement-of-grounds-of-appeal, response-to-appeal, cross-appeal, reply-to-cross-appeal, application-for-provisional-measures, statement-of-defence, nichtzulassungsbeschwerde[-begruendung], revisionsfrist, revisionsbegruendung, rechtsbeschwerde[-begruendung]) with proceeding_type_code narrowing so the result card pills only show the relevant proceeding.

forums tag set per parent + leaf so the inbox-channel chip narrows correctly. Idempotent INSERTs (ON CONFLICT (slug) DO UPDATE). Mig applied live; tracker at v69.

Branch on mai/feynman/fristenrechner is 1 commit ahead of main.

Role variants (Klägerseite vs Beklagtenseite, Berufungskläger vs -beklagte) are still on the Determinator-redesign side — naturally derived from the project context once Slice 1 (project picker) lands. Standing by for the next thread.

Item 4 shipped: **[`fdbbc74`](https://mgit.msbls.de/m/paliad/commit/fdbbc74)** — migration 069 adds 5 new opponent-side parent nodes + 17 leaves under `cms-eingang.gegenseite`: - **upc-app** (UPC Berufungsverfahren) — Berufungsschrift, -begründung, -erwiderung, Anschlussberufung (R.237), Erwiderung Anschlussberufung (R.238). - **upc-pi** (UPC einstweilige Maßnahmen) — Antrag, Erwiderung. - **de-bgh-inf** (DE Revision / NZB BGH (Verletzung)) — NZB, NZB-Begründung, Revisionsschrift, Revisionsbegründung, Revisionserwiderung. - **de-bgh-null** (DE Berufung BGH (Nichtigkeit)) — Berufungsschrift, -begründung, -erwiderung. - **dpma-bgh** (DPMA Rechtsbeschwerde BGH) — Rechtsbeschwerde, RB-Begründung. Each leaf wires to the existing `deadline_concepts` (notice-of-appeal, statement-of-grounds-of-appeal, response-to-appeal, cross-appeal, reply-to-cross-appeal, application-for-provisional-measures, statement-of-defence, nichtzulassungsbeschwerde[-begruendung], revisionsfrist, revisionsbegruendung, rechtsbeschwerde[-begruendung]) with `proceeding_type_code` narrowing so the result card pills only show the relevant proceeding. `forums` tag set per parent + leaf so the inbox-channel chip narrows correctly. Idempotent INSERTs (`ON CONFLICT (slug) DO UPDATE`). Mig applied live; tracker at v69. Branch on `mai/feynman/fristenrechner` is 1 commit ahead of main. Role variants (Klägerseite vs Beklagtenseite, Berufungskläger vs -beklagte) are still on the Determinator-redesign side — naturally derived from the project context once Slice 1 (project picker) lands. Standing by for the next thread.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: m/paliad#15
No description provided.