Verfahrensablauf appeal mode: side selector doesn't filter columns + missing trigger event + duration phrasing/duplication #136
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Four related Verfahrensablauf bugs surfaced by m (2026-05-26 17:35)
All surface on https://paliad.de/tools/verfahrensablauf with the unified Berufung tile (
upc.apl.unified). Some apply to non-appeal proceedings too.Bug 1 — Side selector does nothing on appeal
With
upc.apl.unifiedpicked, switchingside=claimant ↔ defendant ↔ undefineddoesn't change the column projection. After the #132 refactor we collapsed the two selectors into one, but the underlying engine filter / column-bucketing for appeals still acts as if side is undefined. The 5 chip targets (Endentscheidung etc.) do work; only side is dead.Expected: with
side=claimanton appeal, the Berufungskläger column owns the user's filings, the Berufungsbeklagter column shows the opponent's filings. Mirror forside=defendant. Withside=undefined, both columns render every rule.Bug 2 — Missing trigger event on the timeline
The initial event the appeal is anchored to (e.g. Final Decision under R.118, Cost Decision, Order) doesn't appear on the timeline. Only the downstream deadlines do. Lawyers need to see the anchor itself as the first row, so the timeline reads top-down as decision → deadlines → next decision.
Fix surface:
pkg/litigationplanner/engine.go— when anappeal_targetis set, emit a synthetic root event whose name comes from the existingTriggerEventLabelForAppealTarget(target, lang)helper (added in #132), dated to the trigger date. Render it as the first row of the timeline, marked as a trigger event (icon, dimmed, court-set).Non-appeal proceedings should already do this — verify and align if needed.
Bug 3 — Duration label says "nach" without naming the anchor
The new duration affordance from #133 displays "4 Monate nach" but doesn't say nach what. Should be "4 Monate nach Zustellung der Endentscheidung" / "4 months after the final decision is served" etc.
Fix surface:
frontend/src/client/views/verfahrensablauf-core.ts— when formatting the duration string, append the parent rule's name (or the trigger-event-label for root rules). The parent name is already onlp.TimelineEntry.ParentRuleName/ParentRuleNameEN(added in earlier slice for conditional-rule rendering, t-paliad-289).Bug 4 — Duration duplicated when deadline_notes also mentions it
A handful of rules carry the duration in their free-text
deadline_notescolumn (e.g. "Frist 1 Monat VOR der mündlichen Verhandlung (R.109.1)…"). After #133's duration affordance, the duration now renders twice — once as the new badge, once inside the notes.Fix surface: same renderer. Two options:
deadline_notesand strip it before rendering the notes. Regex-based.deadline_notesand let the renderer compose the full string from structured fields. Requires a data audit + rewrite of ~10-20 rule rows.Worker should pick (a) for this slice — it's safe and reversible — and surface (b) as a follow-up for editorial cleanup.
Acceptance
?proceeding=upc.apl.unified&side=claimant→ user column owns Berufungskläger-party rows, opponent column owns Berufungsbeklagter-party rows. Switching toside=defendantmirrors.side=undefinedshows both."<n> <unit> nach <parent>"(or"vor <parent>"), where<parent>is the parent rule's name (or trigger event name for root rules).deadline_notesalso leads with one.go test ./pkg/litigationplanner/... ./internal/services/...green, including a new test covering the appeal-side-filter behaviour and the synthetic-trigger-event emission.bun run buildclean. Frontend test for the notes-deduplication regex.Worker scope
lp.TimelineEntry.ParentRuleName*is populated for every row that has a parent (audit via the Go test or a quick handler call). If not, fix inengine.gofirst.Anti-patterns (lessons from today's mig 134 hotfix-3)
deadline_notesdirectly — go via a migration withset_config('paliad.audit_reason',…)if you absolutely have to. Today's pass should NOT touchdeadline_rulesat all; the notes-dedup is a render-side regex.information_schema.columnsvia Supabase MCP before any data work.