From 23b151c0f36da23f1d6ee66b8c70dfc1177caea6 Mon Sep 17 00:00:00 2001 From: mAi Date: Wed, 27 May 2026 20:56:51 +0200 Subject: [PATCH 1/3] =?UTF-8?q?design(procedures-tracker):=20t-paliad-337?= =?UTF-8?q?=20shift-1=20=E2=80=94=20workflow-tracker=20layer=20for=20/tool?= =?UTF-8?q?s/procedures=20(m/paliad#152)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit m's reframe (2026-05-27 20:43): /tools/procedures should be a workflow tracker, not a catalog browser. Pick any procedural event, see backward (predecessors) + self (where I am) + forward (successors), with scenario_flags as togglable predicates and alternative constellations explorable. This shift-1 doc covers: - 4-tab UX redo (single-pane radio-revealed entry form to fix the pre-form-leak bug) - Anchor visualisation (vertical waterfall with anchor at centre line) - Three views — Anchor / Verfahren / Konstellationen — toggle preserves anchor + scenario state - Forward walk (current constellation only by default, conditional reveal toggle, view-mode toggle reused from atlas P3) - Backward walk (3 hops default, Akte mode overlays paliad.deadlines actuals onto template chain) - Compound rules drawer (per-anchor Querverweise affordance — column shape owned by curie editorial workstream) - Constellation viewer (inline per-flag preview drawer + full Constellation view for browse) - Akte entry (anchor derives from latest completed deadline) - Migration: T1-T5 flag-gated dev under ?tracker=1, then hard-cut Coder gate held. 11 open questions for m staged for AskUserQuestion in 4+4+3 batches. Decisions append as §13 before the TRACKER DESIGN READY FOR REVIEW signal. --- ...-procedures-workflow-tracker-2026-05-27.md | 648 ++++++++++++++++++ 1 file changed, 648 insertions(+) create mode 100644 docs/design-procedures-workflow-tracker-2026-05-27.md diff --git a/docs/design-procedures-workflow-tracker-2026-05-27.md b/docs/design-procedures-workflow-tracker-2026-05-27.md new file mode 100644 index 0000000..d0b170a --- /dev/null +++ b/docs/design-procedures-workflow-tracker-2026-05-27.md @@ -0,0 +1,648 @@ +# Design — `/tools/procedures` workflow tracker (m/paliad#152) + +**Task:** t-paliad-337 +**Gitea:** m/paliad#152 +**Inventor:** atlas (shift-1, fresh — name-recycle, not the atlas from earlier today) +**Date:** 2026-05-27 +**Branch:** `mai/atlas/inventor-extend-tools` +**Status:** Draft — coder gate held; m to ratify via `AskUserQuestion` before any coder shift. + +**Builds on:** +- `docs/design-unified-procedural-events-tool-2026-05-27.md` (cronus's U0-U4 design, shipped today as `/tools/procedures`) +- `docs/design-deadline-system-revision-2026-05-27.md` §3.3 + §3.3a (atlas Phase 2 model layer + view-mode toggle) +- `docs/design-fristenrechner-overhaul-2026-05-26.md` (cronus 2026-05-26 Mode A+B+result, shipped via t-paliad-322) + +--- + +## §0 Premises — what shipped today, what m hit, what this design does + +### §0.1 What's on prod right now (verified live) + +Today's `/tools/procedures` (U0-U4 shipped via m/paliad#151, knuth, 1718ea2) is a **catalog browser**: + +- One page, **4 always-visible tabs** at the top: "Verfahren wählen" / "Direkt suchen" / "Geführt" / "Aus Akte". +- A shared top-of-page filter strip (search box + 4 chip rows for forum / proceeding / event kind / party). Chip hydration unwired in U0; the search box is markup-only. +- "Verfahren wählen" tab boots the Verfahrensablauf 3-step wizard (pick PT → set perspective+date → result tree with `mandatory_only` / `selected` / `all_options` toggle). +- "Direkt suchen" boots Mode A search; "Geführt" boots Mode B wizard; "Aus Akte" is a placeholder. +- All entry tabs converge on the linear result view (`#fristen-overhaul-root`) for "what's next after this event", or the Verfahrensablauf tree for "what's the whole shape of proceeding X". +- Two output paths: TREE (proceeding-anchored, Verfahrensablauf) and LINEAR (event-anchored, Mode A/B result view). + +**Live data the tracker has to work against** (verified 2026-05-27 against `paliad.sequencing_rules`): + +| metric | value | +|---|--:| +| total rules | 242 (231 published) | +| chained (parent_id not null) | 110 | +| trigger-rooted (trigger_event_id not null) | 78 | +| spawns (cross-PT) | 4 | +| court-set (no computed date) | 47 | +| conditional (condition_expr not null) | 18 — 6 `with_ccr` / 4 `with_amend` / 4 `with_cci` / 4 compound `with_ccr AND with_amend` | +| biggest tree | `upc.inf.cfi` (PT id=8) = 50 rules | + +`paliad.deadlines` carries both `procedural_event_id` and `sequencing_rule_id` per row — so an Akte's "where am I" can be derived from `status='done'` deadlines (the actuals chain) without inferring from rule_code text. + +### §0.2 m's bugs (2026-05-27 20:43 + 20:46) + +> "view proceedings with all possible constellations and the sequences and determine **where we are** in that sequence and **what steps are coming next** for any given procedural event" + +m's specific UX failures in the live page: + +1. **4 tabs visible at once — pre-form leaks across tabs.** Each tab has its own pre-form (PT-picker, search input, R1-R5 wizard, akte-picker). When one is partly filled the others stay half-filled visually under the same filter strip — the page feels like 4 disjoint forms sharing chrome, not one workflow. +2. **Result view fires too many rules.** The linear view dumps every direct child of the anchor — including conditional rules whose flag isn't set, and compound rules (curie's 7 flagged) that join multiple predecessors. A wall of events instead of a focused next-step list. +3. **Proaktiv / Gericht / Reaktiv columns don't carry workflow weight.** The 3-column swimlane (Unsere Seite / Gericht / Gegenseite) is a *stance* grouping, not a *sequence* anchor — useful for side comparison, useless for "where am I in the chain". +4. **No 'you are here' indicator.** The current result view shows children of the anchor but never visualises *the anchor itself* as a position in a larger chain. +5. **Sequence isn't visualised as a sequence.** Flat list grouped by priority, not chained-from-X. + +### §0.3 What this design is and isn't doing + +**Is:** redesign of `/tools/procedures` *surface layer* — entry experience, anchor visualisation, forward/backward walks, constellation viewer, compound-rule treatment, Akte entry. The unified catalog (cronus's U0-U4) is the substrate; the tracker is a new mental model layered on top. + +**Is not:** + +- Schema change. `sequencing_rules` parent_id + condition_expr + is_spawn + is_court_set are sufficient. `paliad.deadlines.procedural_event_id` + `sequencing_rule_id` exist for the actuals chain. No mig. +- Calculator change. +- Editorial backfill (curie's t-paliad-333 still owns the 7 compound rules + R.109 chain). +- `/admin/procedural-events` write surface. +- `/projects/{id}` Verlauf or SmartTimeline — they consume the tracker's output via cross-link, they're not subsumed. +- youpc.org / Outlook sync / PDF export. + +--- + +## §1 The workflow tracker — single conceptual move + +The tool's central object becomes **the anchor**: one procedural event the user has picked (or arrived at). Everything else is computed against it: + +- **Backward**: the predecessor chain that led here (parent_id walk, capped depth N). +- **Self**: the anchor card — rule, deadline, party, computed date. +- **Forward**: the successor tree (children rules, filtered by current scenario state). +- **Constellation**: the scenario_flags as togglable predicates, with the option to preview alternative branches. +- **Cross-cuts**: compound rules where this anchor is one of multiple predecessors, surfaced separately. + +The shipped page conflates *picking* and *exploring*. The tracker separates them: picking happens once, in a unified entry form; exploring is the whole rest of the page. + +### §1.1 Three views, one anchor + +Per m's brief — three plausible shapes for the same anchored state, with toggle: + +1. **Anchor view (default)** — single event centred, backward chain above, forward tree below. The "where am I + where am I going" shape. Highest information density per square pixel for the question m posed. +2. **Proceeding view** — entire proceeding tree (current Verfahrensablauf shape), with the anchor highlighted as "you are here". Useful when the user needs to zoom out and see the bigger picture without losing position. +3. **Constellation view** — multi-branch overview. The proceeding tree rendered as N parallel sub-trees, one per known scenario_flag combination relevant to the anchor's proceeding. Browsing/comparison shape, not the daily workflow. + +The user toggles between them via a 3-way segmented control above the output. The anchor persists across toggles; scenario_flags persist; backward/forward depth preference persists. + +### §1.2 Why "anchor view" beats today's "linear result" + "tree" split + +The shipped page treats "tree" and "linear" as different *output modes* tied to different *entry tabs*: Verfahren → tree, Direkt/Geführt → linear. But the question m's framing exposes is anchor-relative regardless of entry: "given an event I care about, what's the immediate context?" + +The Anchor view answers that uniformly: +- If the user entered via "Direkt suchen" → search lands them on an anchor → Anchor view renders. +- If via Wizard → R4 lands them on an anchor → Anchor view renders. +- If via "Verfahren wählen" → they pick a PT, then a starting anchor inside that PT (default: the proceeding's root event); Anchor view renders. +- If via Akte → anchor derives from the project's most recent completed deadline (§5.3); Anchor view renders. + +Today's two outputs collapse to one, parametrised by anchor. + +--- + +## §2 §A — Tab UX redo + +m's bug #1 — "4 tabs visible at once, pre-form leaks across them". The recommendation in cronus's design ("all four tabs visible") shipped and demonstrably increased friction. The tracker picks a different shape. + +### §2.1 Three candidates + +**(a) Single-pane entry form with reveal-on-pick (Inventor recommendation).** + +One panel above the output area asking "Wie willst du das Ereignis finden?" with four mechanism options as radio chips. The currently-selected mechanism reveals its sub-form inline; others collapse to a one-line summary. Picking a different mechanism collapses the active form and reveals the next one. State persists when switching back (search query stays, wizard answers stay). + +``` +┌─ Ereignis finden ───────────────────────────────────────┐ +│ Wie willst du suchen? │ +│ ( ) Verfahren wählen (•) Direkt suchen │ +│ ( ) Geführt ( ) Aus Akte │ +│ │ +│ [ 🔍 Klageerwiderung______________ ] Filter: UPC · filing │ +│ Ergebnisse: 3 Treffer — pick one to anchor │ +│ • Klageerwiderung (defendant) [upc.inf.cfi] │ +│ • Klageerwiderung (defendant) [upc.rev.cfi] │ +│ • Klageerwiderung (defendant) [upc.dmgs.cfi] │ +└──────────────────────────────────────────────────────────┘ + +┌─ Anker ────────────────────────────────────────────────────┐ +│ (empty until user picks — placeholder: "Wähle ein Ereignis │ +│ oben aus, um Vor- und Nachgeschichte zu sehen") │ +└────────────────────────────────────────────────────────────┘ +``` + +After picking, the entry panel collapses to a one-line summary (`Anker: Klageerwiderung [upc.inf.cfi, defendant] — ändern`) and the Anchor view fills the rest of the page. + +**(b) Mutually-exclusive tabs.** Keep the 4-tab shape but enforce one-at-a-time visible: switching tabs hides all the others' pre-form markup *and resets their inputs*. Solves the leak by force-resetting. Cheap to implement (existing code, drop reset on switch). + +**(c) Drawer-overlay entry.** Page boot lands on an empty Anchor view with a "Ereignis wählen" CTA. Clicking opens a side drawer / overlay sheet containing all 4 mechanisms as collapsible sections. Picking dismisses the drawer; the anchor is set. "Ereignis ändern" reopens the drawer with prior state. + +### §2.2 Trade-offs + +| | (a) single-pane | (b) mutex-tabs | (c) drawer | +|---|---|---|---| +| Solves leak | ✓ (one form visible) | ✓ (force-reset on switch) | ✓ (overlay is modal) | +| Preserves the 4 named mechanisms m wants visible | ✓ (radio cluster) | ✓ (tabs) | ◐ (hidden until opened) | +| Mental model of "page = workflow, not entry" | ✓ (entry is a tight pre-form; anchor is the page) | ◐ (4 tabs still feel like separate workflows) | ✓✓ (page is anchor-first) | +| Switching mechanism friction | low (click radio) | low (click tab) | medium (open drawer, switch section) | +| Mobile | ✓ (radio cluster collapses to chip strip) | △ (4 tabs need scroll) | ✓ (drawer is bottom-sheet) | +| Implementation cost | medium (rebuild entry panel) | low (toggle reset behaviour) | medium-high (new drawer component) | + +**Recommendation: (a)**. The bug isn't "the 4 tabs exist" — it's "the entry form is the dominant chrome of the page when it should be a small pre-flight". A single-pane form with radio-revealed sub-forms keeps the four entry mechanisms named and visible (m's Q3 spirit preserved) while pushing the anchor view into the role of "the page". + +(b) is the cheapest patch but doesn't address the deeper issue m flagged: the four tabs visually compete with the output for attention. (c) over-corrects toward modality and hides the named mechanisms behind a CTA. + +--- + +## §3 §B — Anchor visualisation (you-are-here) + +m's bug #4 — "no 'you are here' indicator". The Anchor view's job. + +### §3.1 Three candidates + +**(a) Vertical waterfall with anchor at the centre line (Inventor recommendation).** + +``` + Vorgeschichte (3 Schritte) + │ + ┌──────────┴──────────┐ + │ Klageerhebung │ ← 60 days ago [SoC · M] + │ (upc.inf.cfi.soc) │ + └──────────┬──────────┘ + │ 3 Monate (R.23.1) + ▼ + ╔═══════════════════════════════════╗ + ║ ▶ Klageerwiderung ║ ← DU BIST HIER + ║ defendant · mandatory · 2026-04-01 ║ [Im Verfahren zeigen] + ║ Frist: R.23.1 (3 Monate) ║ [Konstellationen] + ║ Akte: HL-2024-001 (eingetragen) ║ [Querverweise (2)] + ╚═══════════════════════════════════╝ + │ + ┌──────────┴──────────┐ + ▼ ▼ + ┌─────────────────┐ ┌─────────────────┐ + │ Replik │ │ Vorl. Einwend. │ (Vorschau: 2 Monate) + │ claimant · M │ │ defendant · O │ ← Sofort-Folgen + │ 2026-06-01 │ │ 2026-04-15 │ + └────────┬────────┘ └─────────────────┘ + │ + ▼ + ┌─────────────────┐ + │ Duplik │ + │ defendant · M │ + │ 2026-07-01 │ + └─────────────────┘ + + ▼ Weitere Folgeketten (4 mehr) ▾ +``` + +The anchor is the focal card (boxed, larger, contrasting border). Predecessors fade upward into the page; successors expand downward in a tree. Visual weight = anchor > immediate neighbours > distant chain. + +**(b) Sticky horizontal "you are here" strip.** A breadcrumb-style top band: `... ◄ Klageerhebung — ▶ Klageerwiderung (HERE) — Replik — Duplik ► ...`. Click any chip to re-anchor. Below the strip, vertical forward tree (children only). + +Pros: compact, mobile-friendly, breadcrumbs are familiar. Cons: loses chain depth (breadcrumbs are 1D; the predecessor chain isn't always linear — multiple parallel parents at depth 2+ exist). + +**(c) Card-as-frame.** A large card frames the anchor. Top border embeds the predecessor chain as a slim bar; bottom border opens into the forward tree. Outside the card is the rest of the page. + +Pros: visually obvious where the anchor sits. Cons: card chrome eats vertical space; doesn't scale to long forward trees (where does the card end?). + +### §3.2 Recommendation: (a) vertical waterfall + +It matches m's mental model of "where I came from / where I am / where I'm going" as top-to-bottom chronology. The anchor's visual prominence is unambiguous. Chain depth is preserved naturally. Trees with multiple children fan out cleanly. On mobile, the waterfall collapses to a single column with the anchor card sticky-positioned at viewport top (vertically scrollable predecessors above, successors below). + +--- + +## §4 §C — Forward walk + +m's bug #2 — "result view fires too many rules". The forward walk is the load-bearing affordance for this design; it has to be clean by default and explorable on demand. + +### §4.1 Render rules for the forward walk + +For the anchor `A`, render rules whose `parent_id = A.sequencing_rule_id`. Filter: + +1. **Active constellation**: a rule with `condition_expr` renders iff the expression evaluates to `true` against the current `projects.scenario_flags` (or localStorage equivalent for kontextfrei). Default = hidden. +2. **View-mode** (atlas P3's three-way toggle, reused): "Nur Pflicht" / "Gewählt" (default) / "Alle Optionen". Composes with #1: + - "Nur Pflicht": only `priority='mandatory'`. + - "Gewählt": mandatory + selected per scenario state. Conditional rules visible iff their flag is on. + - "Alle Optionen": every rule the proceeding could fire renders, conditional ones greyed with their flag hint. +3. **Spawn rules** render as a single CTA card `▼ Tochterverfahren öffnen: ` rather than a tree node — clicking re-anchors into the spawned proceeding. +4. **Court-set rules** render in place with the "vom Gericht bestimmt" badge instead of a computed date; included by default in "Gewählt". +5. **Compound rules**: NOT shown inline in the forward walk. Surfaced separately via the "Querverweise (N)" affordance on the anchor card (see §6). + +### §4.2 Conditional gates default — three candidates + +**(a) Hide unless flag set, with "Bedingte anzeigen" toggle (Inventor recommendation).** Default forward view shows current-constellation rules only. A one-click toggle reveals greyed conditional rules with their flag hint. + +**(b) Show all conditional rules greyed with hint.** Current Verfahrensablauf "Alle Optionen" semantics applied to forward view by default. + +**(c) Hide and surface in a separate "Andere Konstellationen" drawer.** Conditional rules don't show in the forward walk at all; instead the constellation viewer (§7) handles them. + +### §4.3 Recommendation: (a) + +m's bug #2 was explicitly "too many rules including conditional whose flag isn't set". (b) reproduces the bug. (c) is too aggressive — the user often wants a quick glance at "what would change if I tick with_ccr". (a) keeps the default clean and gives a one-click reveal. + +The reveal toggle composes with the view-mode toggle: +- View-mode = "Nur Pflicht" + Bedingte anzeigen OFF → only mandatory rules with no conditional gate +- View-mode = "Gewählt" + Bedingte anzeigen OFF → default Akte/kontextfrei view, current constellation only +- View-mode = "Alle Optionen" + any → all rules, conditional greyed + +### §4.4 Depth cap + +Forward walk capped at depth 5 by default (the deepest tree today is `upc.inf.cfi` at depth 4 for the CCR branch). Beyond depth 3, deeper subtrees collapse to a `▼ +N weitere Schritte` chip per branch, clicking expands inline. + +--- + +## §5 §F — Backward walk + +m's brief: "default 2-3 hops of predecessors; in Akte mode use actual completed deadlines". + +### §5.1 Default depth: 3 hops + +Three hops is the right default empirically: +- For `upc.inf.cfi` at the Duplik anchor (depth 3 from SoC), 3 hops shows SoC → Klageerwiderung → Replik → Duplik (anchor). +- For shallower trees (`upc.apl.cost` at depth 1), the chain just renders as 1 hop with no fold-up. +- Beyond 3 hops, a `▲ Weitere Vorgeschichte anzeigen` chip expands the chain upward to the root. + +### §5.2 Kontextfrei mode + +The parent_id chain walked upward from the anchor's sequencing_rule. Each hop renders as a compact card (rule code, event name, primary_party, computed-date-if-trigger-date-set). No deadline state (kontextfrei has no Akte). + +### §5.3 Akte mode + +Hybrid — the backward chain integrates with the project's actual completed deadlines. + +For each parent_id hop, query `paliad.deadlines WHERE project_id = $1 AND sequencing_rule_id = $2`: +- **If a deadline exists with `status='done' or status='deleted'`** → render as a "done" card with the actual completion date, audit reason, source ("Akte: 2026-03-15 erledigt"). +- **If a deadline exists in another status** → render with that status badge (open / overdue / in-progress) plus the actual due_date. +- **If no deadline exists** → render as a "Vorlage" (template) card with the computed date if a project-level trigger_date is set, else "(noch nicht eingetragen)". + +This gives m's "the chain backward (parent_id walk) showing the events that led here" both as the template chain (kontextfrei) AND as actuals-overlaid template (Akte). The template and the actuals are the same chain, just with state badges. + +### §5.4 Three candidates for Akte backward semantics + +**(a) Actuals-overlaid template chain (Inventor recommendation).** The template chain walked via parent_id, but each node's card carries the actual deadline state from the project. One render, full information. + +**(b) Pure actuals chain.** Only render nodes for which a `paliad.deadlines` row exists. Anchor's backward chain shows only what's actually happened, no template prediction. + +**(c) Two-section split.** Top section: actuals (completed deadlines from this Akte, chronological). Bottom section: template chain (what the rules say). Anchor card sits between them. + +### §5.5 Recommendation: (a) + +(b) loses information when the user hasn't entered every deadline yet (common — Sandra in §10.3's persona only enters what comes in via CMS). (c) doubles the vertical real estate and creates two parallel mental models. (a) keeps one chain with state badges — honest about what's actual vs template, single read path. + +--- + +## §6 §I — Compound rules drawer + +The 7 curie-flagged compound rules — rules where a single sequencing_rule has multiple predecessor events (the parent_id model fits 1:N, not N:1). They don't fit cleanly in either the backward chain (which is itself, but for one of N predecessors) or the forward walk (a child of one parent, but with cross-cutting logic that involves siblings of that parent). + +### §6.1 Treatment in the tracker + +- **Hidden by default** in both backward and forward walks. Inclusion would clutter the chain with rules whose triggering condition is "X OR Y", visually ambiguous about which path matters. +- **Surfaced via "Querverweise (N)" affordance on the anchor card.** N = count of compound rules where this anchor is one of the multiple predecessors. Click expands an inline drawer listing each compound rule with explicit annotation: + +``` +┌─ Querverweise (2) ───────────────────────────────────────────┐ +│ Diese Frist betrifft das aktuelle Ereignis auch: │ +│ │ +│ ▸ Antrag auf Verfahrensruhen (R.295) │ +│ auch ausgelöst durch: Klageerwiderung (HIER) | Replik | │ +│ Duplik | Schriftsatzwechsel im Patentänderungsantrag │ +│ Frist: kein fixes Datum (vor MV) [Detail] │ +│ │ +│ ▸ Antrag auf prozessleitende Verfügung (R.333) │ +│ auch ausgelöst durch: jeder Schriftsatzeingang ab SoD │ +│ Frist: 14 Tage nach Schriftsatz [Detail] │ +└────────────────────────────────────────────────────────────────┘ +``` + +### §6.2 Wiring + +Compound rules need an explicit marker — currently flagged via curie's editorial pass. Concrete shape (suggestion for the editorial side, not blocking this design): + +- `paliad.sequencing_rules` gains a nullable `compound_predecessors uuid[]` column. NULL = ordinary parent_id rule. Non-null = list of additional procedural_event_ids that ALSO trigger this rule (parent_id stays as the "primary" predecessor for backward-walk purposes). +- The tracker's `Querverweise` count = count of rules where ` = ANY(compound_predecessors) OR parent_rule.procedural_event_id = `. + +This is a separate ticket for curie's editorial workstream; the tracker reads whatever column shape lands. For the inventor-deliverable, the *placement* (drawer per anchor) is the design call; the column shape is a heads-up. + +If curie's split-review yields a different column name / shape, the tracker reads that instead. No tracker-side cost to swap. + +### §6.3 Three candidates + +**(a) Hidden by default, "Querverweise" drawer on anchor card (Inventor recommendation).** + +**(b) Inline at appropriate anchor points in the forward walk.** Compound rules render in-tree at each of their predecessor positions, with a "(auch ausgelöst durch X, Y)" annotation. + +**(c) Separate top-level "Übergreifende Regeln" section above the anchor card.** A persistent section listing all compound rules relevant to the proceeding, regardless of current anchor. + +### §6.4 Recommendation: (a) + +(b) reintroduces m's bug #2 (too many rules in the walk). (c) decouples the cross-cuts from the anchor — but m's framing is anchor-relative ("for any given procedural event"), so cross-cuts should be anchor-scoped. The drawer per anchor is the cleanest match. + +--- + +## §7 §H — Constellation viewer + +m's brief: "alternative-branches drawer. When viewing inf.cfi chain with `with_ccr=false`, surface a 'see what the CCR branch looks like' affordance that overlays the CCR-only rules." + +### §7.1 Three candidates + +**(a) Inline per-flag preview drawer (Inventor recommendation).** On the anchor card, a `[Konstellationen]` button reveals a drawer: + +``` +┌─ Konstellationen ────────────────────────────────────────────┐ +│ Aktuelle Konstellation: with_ccr=false, with_amend=false │ +│ Relevant für dieses Verfahren: │ +│ │ +│ ▸ with_ccr (Widerklage auf Nichtigkeit) aus │ +│ [vorschau] Wenn an: 3 zusätzliche Fristen entstehen, │ +│ inkl. Replik auf Widerklage (claimant, R.29.a, 2 Monate) │ +│ [Konstellation übernehmen] │ +│ │ +│ ▸ with_amend (Antrag auf Patentänderung R.30) aus │ +│ [vorschau] Wenn an: 2 zusätzliche Fristen entstehen, │ +│ inkl. Defence-to-amend (defendant, R.32.1, 2 Monate) │ +│ [Konstellation übernehmen] │ +└────────────────────────────────────────────────────────────────┘ +``` + +Each row carries: flag name + human label, current state, a "Vorschau" toggle that overlays the conditional rules in the forward walk (greyed with the flag hint colour for that flag), and a "Konstellation übernehmen" CTA that actually flips the flag in scenario_flags. + +**(b) Side-by-side branch comparison.** A two-column layout: left = current constellation forward tree, right = "with_ccr=true" forward tree. Toggle right pane between known scenarios. + +Pros: literal visual diff. Cons: doubles horizontal space; mobile-impossible; rare workflow (m's actual question is mostly "what would change if X", not "compare A vs B side by side"). + +**(c) Full-page swap with breadcrumb.** Click a flag → page swaps the forward tree to that constellation's view; breadcrumb back to current. + +Pros: simple. Cons: loses current constellation visibility while exploring; the comparison isn't visual, only mental. + +### §7.2 Recommendation: (a) + +It matches the exact pattern m described ("surface a 'see what the CCR branch looks like' affordance that overlays the CCR-only rules"). The preview toggle is non-committal (no state change unless user explicitly takes the constellation); the "Konstellation übernehmen" CTA is the explicit write. + +Scoping: only flags relevant to the anchor's proceeding render in the drawer (deduced from condition_expr usage across the proceeding's rule set). E.g., `upc.dmgs.cfi` doesn't carry `with_ccr` — the drawer is hidden or empty for anchors there. + +### §7.3 "Constellation view" (the third top-level view) + +The full Constellation view (§1.1 #3) is a separate render mode reached via the top toggle, intended for *browsing* the constellation matrix without committing. It shows the proceeding's whole tree N times in parallel mini-panes, one per relevant flag combination: + +``` +┌─ ohne Optionen ─────────┐ ┌─ with_ccr ──────────────┐ +│ SoC │ │ SoC │ +│ ├─ KEW │ │ ├─ KEW + CCR │ +│ │ └─ Replik │ │ │ ├─ Replik (no-ccr) │ +│ │ └─ Duplik │ │ │ └─ Replik-to-CCR (+) │ +│ └─ (keine Folgen) │ │ │ └─ Rejoinder │ +│ │ │ └─ App-to-amend (R.30)? │ +└──────────────────────────┘ └──────────────────────────┘ +┌─ with_amend ────────────┐ ┌─ with_ccr + with_amend ──┐ +│ SoC │ │ SoC │ +│ ├─ KEW + App-to-amend │ │ ├─ KEW + CCR + Amend │ +│ │ ├─ Defence-to-amend │ │ │ ├─ Defence-to-amend │ +│ │ └─ Replik │ │ │ └─ Replik-to-CCR │ +└──────────────────────────┘ └──────────────────────────┘ +``` + +This is the "view all constellations at a glance" shape; rare use, but useful for the Friday-brief partner persona (§10.2 of cronus's design). Mobile: stacks vertically. + +--- + +## §8 §D — Three views toggle + +The top of the output carries a 3-way segmented control: + +``` +┌─ Ansicht ──────────────────────────────────────────────┐ +│ (•) Anker ( ) Verfahren ( ) Konstellationen │ +└────────────────────────────────────────────────────────┘ +``` + +### §8.1 Anchor view (default) + +Per §3 + §4 + §5. The "where am I + where am I going" canonical shape. + +### §8.2 Proceeding view + +The current Verfahrensablauf tree (atlas P3 shape), with the anchor highlighted. Same view-mode toggle (Nur Pflicht / Gewählt / Alle Optionen). The "you are here" treatment: + +- The anchor card gets a vertical band stripe down its left edge in the lime accent colour (`#c6f41c`, the brand colour). +- Auto-scroll-into-view on toggle to Proceeding mode, with smooth scroll. +- Crumb above the tree: `📍 Anker: Klageerwiderung — [zur Ankeransicht]`. +- The 3-column swimlane (existing "Schwimmbahnen" toggle from atlas P3) remains as an optional sub-view within Proceeding view, NOT a top-level view of its own. Stance grouping is orthogonal to position in chain (m's bug #3). + +### §8.3 Constellation view + +Per §7.3. Mini-panes per relevant flag combination, each a compact rendering of the proceeding tree under that combination. The anchor is highlighted in every pane that contains it. Browsing/comparison shape; less common. + +### §8.4 Why three and not two + +Anchor + Proceeding cover the "where am I" and "zoom out" needs. The third (Constellation) is m's explicit framing requirement ("view proceedings with all possible constellations"). Skipping it would leave that piece in the per-flag drawer (§7.1), which is anchor-relative — not the "view all constellations" overview. + +--- + +## §9 §J — Akte entry + +m's brief: "when user arrives from /projects/{id}, derive anchor from the project's latest completed deadline (or selectable). Wire through P0 SSoT." + +### §9.1 Anchor derivation + +When the user navigates to `/tools/procedures?project=` (or picks the Akte from the Akte picker mid-flight): + +1. Load `projects` row → proceeding_type_id, our_side, scenario_flags. Pre-fill perspective + constellation. +2. Query `paliad.deadlines WHERE project_id = $project AND sequencing_rule_id IS NOT NULL ORDER BY completed_at DESC NULLS LAST, due_date DESC LIMIT 1`: + - If row found with `completed_at IS NOT NULL` → anchor = that rule's sequencing_rule_id. Trigger date = `completed_at::date`. + - If row found but `completed_at IS NULL` → anchor = that rule. Trigger date = `due_date` (the *next* open deadline). + - If no rows → anchor = proceeding's root sequencing_rule (parent_id IS NULL, sequence_order = MIN). Trigger date = today (or project's `start_date` if set). + +### §9.2 Anchor switch within an Akte + +Once landed, the user can switch the anchor: + +- Click any forward-walk node → it becomes the new anchor (re-anchors the whole view). +- "Anker ändern" button on the anchor card → reopens the entry form panel for re-selection. +- URL-deep-link param `?event=` overrides the derivation. + +The chosen anchor doesn't write back to the project — anchor is a UI-state thing per session, not project metadata. Scenario_flags writes do persist (as today, via `PATCH /api/projects/{id}/scenario-flags`). + +### §9.3 Cross-link from project Verlauf + +Each row in `/projects/{id}` Verlauf renders an action chip "▸ Im Verfahren zeigen" → links to `/tools/procedures?project=&event=`. The tracker opens with that exact event anchored. + +Existing related cross-link (cronus's design §3.2 / §8 cross-pivot) — preserved. + +### §9.4 Three candidates for Akte default anchor + +**(a) Latest completed deadline (Inventor recommendation).** Falls back to next open, then to proceeding root. + +**(b) Explicit picker every visit.** Akte landing → entry form with the Akte's proceeding pre-filled but no anchor yet; user picks each visit. + +**(c) Last-viewed anchor per Akte (localStorage).** Remember the user's last anchor for this project, restore on re-entry. + +### §9.5 Recommendation: (a) + +(a) is the lowest-friction landing for the modal Sandra-paralegal workflow ("today's Hinweisbeschluss came in, where am I now?"). (b) adds a click every visit. (c) is plausible but adds hidden state — the user can't tell why they're landing on this anchor. + +(a) + the explicit "Anker ändern" affordance covers (b) and (c) as opt-ins. + +--- + +## §10 §E — Compound rules: deferral + +The 7 compound rules curie flagged for m's split-review are NOT part of this design's editorial scope. The tracker's job is: + +1. Render the Querverweise drawer per anchor (§6.1) — the *placement* decision. +2. Read whatever column shape curie's editorial workstream lands on for the cross-cutting marker. + +If curie's editorial pass yields `compound_predecessors uuid[]` (§6.2 suggestion), the tracker reads it. If a different shape (a separate `paliad.compound_rule_predecessors` join table, say) — same drawer, different query. + +The 7 specific rules curie flagged (per memory `b6a11b55` and the editorial backlog) need m's split-review before the column shape locks. This design doesn't force a column shape; it locks the *surface placement*. + +--- + +## §11 §K — Migration plan + +### §11.1 The shape + +5-slice train, all surface-layer, no DB mig (modulo the curie editorial column for compound rules, which is a separate workstream): + +| Slice | What ships | Reversible? | +|---|---|---| +| **T1 — Tracker scaffolding behind `?tracker=1`** | New `procedures-tracker.ts` mounts under the entry form. URL flag `?tracker=1` toggles. Existing 4-tab UI stays the default. | Yes — flag-gated | +| **T2 — Anchor view + backward + forward walks (kontextfrei)** | The waterfall (§3) + N-hop backward (§5.2) + scenario-aware forward (§4) without Akte hookup. Works on any `?event=&trigger_date=&party=` URL. | Yes — code-only | +| **T3 — Akte entry + actuals overlay** | `?project=` derives anchor (§9.1), backward walk overlays Akte deadlines (§5.3), scenario_flags load from project, write-back via existing endpoints. | Yes — code-only | +| **T4 — Constellation drawer (§7) + Constellation view (§7.3) + Proceeding view (§8.2) + view toggle (§8)** | The 3-way toggle, plus the per-flag drawer + multi-pane overview + you-are-here marker on the existing Verfahrensablauf tree. | Yes — code-only | +| **T5 — Hard cut: `?tracker=1` becomes default + drop catalog tabs** | `procedures.tsx` rewrites to mount the tracker shell only. Legacy entry-tab logic in `procedures.ts` deleted. Sidebar / cmd-K unchanged (URL same). | Reversible by revert PR | + +### §11.2 Why flag-gated dev + hard cut + +m's Q11 precedent on cronus's design — internal user base (~50 lawyers), direct comm absorbs the cut cost, no 2-week dual ship. The tracker is even less of a URL change than U4 was (same `/tools/procedures`, different page shape). The flag-gated dev period (T1-T4) lets curie + m + 2 PA sanity-check before T5 hard-cut. + +### §11.3 What stays unchanged + +- URL: `/tools/procedures` keeps it. +- Sidebar entry "Verfahren & Fristen" keeps it. +- cmd-K palette keeps it. +- All knowledge-platform tools, projects, deadlines, calendars — untouched. +- Calculator (`pkg/litigationplanner.CalculateRule`) — untouched. + +### §11.4 Out-of-band dependencies + +- The compound-predecessors column shape (§6.2) is owned by curie's editorial workstream. Tracker reads whatever lands. If it slips past T4, the Querverweise drawer ships with `compound_predecessors = []` for everyone and the count badge is always 0 — degraded gracefully. +- The Akte actuals overlay (§5.3) reads `paliad.deadlines.sequencing_rule_id`. The column exists today; nothing new. + +### §11.5 Test surface + +Per slice, manual + Playwright smoke: + +- T1: feature flag toggles correctly; both views render. +- T2: kontextfrei anchor view → predecessor chain depth varies by anchor pick; scenario flags toggle conditional rules; spawn rules render as CTA. +- T3: Akte landing derives anchor; actuals overlay shows status badges; write-back persists. +- T4: view toggle preserves anchor; Proceeding view scrolls to anchor; Constellation drawer previews flag flips. +- T5: legacy URL params (`?mode=…`) still work via 301 → mapped to anchor/proceeding entries on tracker. + +--- + +## §12 Worked examples — 4 personas + +### §12.1 Sandra (paralegal) — Akte landing on Hinweisbeschluss day + +1. Sandra opens HL-2024-001 in Paliad. Project Verlauf shows yesterday's "Klageerwiderung" deadline now `status=done` (Sandra ticked it after the filing came in). +2. She opens `/tools/procedures?project=HL-2024-001`. Tracker derives anchor = Klageerwiderung (sequencing_rule), trigger_date = yesterday (completed_at). +3. Anchor view: + - Backward chain: SoC (done, dated, badged) → Klageerwiderung (anchor, completed) + - Forward walk: Replik (claimant, 2026-06-01, mandatory) → Duplik (defendant, 2026-07-01) + - Optional fan-out: Vorl. Einwendungen (defendant, 2026-04-15) +4. Today's Hinweisbeschluss came in. She types "Hinweis" in the entry-form search (top of page, always available). 1 hit: `upc.inf.cfi.cmo_review`. Click → re-anchors the view; new anchor = Hinweisbeschluss, trigger_date = today. +5. Anchor view re-renders: + - Backward: shows the chain back to Klageerwiderung (which is parent_id of Hinweisbeschluss in the rule graph). 3 hops total. + - Forward: `upc.inf.cfi.cmo_review_resp` (Antrag CMO-Überprüfung), 14 Tage from today. +6. She ticks "In Akte speichern" (the linear-result write-back affordance, embedded as a footer button on the forward walk). Deadline inserted. + +Total clicks: 5 (open tool, type search, click result, tick, save). + +### §12.2 Becker (senior partner) — Friday client brief on full UPC infringement ablauf + +1. Becker opens `/tools/procedures`. No Akte. Entry form radio set to "Verfahren wählen". +2. Picks `upc.inf.cfi` chip. Anchor defaults to the proceeding root (SoC). Trigger date = today. +3. Top toggle: "Verfahren" view. Full tree renders, anchor = SoC highlighted at top. +4. Becker wants to brief the CCR scenario. Anchor card → "Konstellationen" drawer → ticks `with_ccr` "Konstellation übernehmen". Tree re-renders with CCR branch lit up. +5. Cmd-P / "Drucken" (out of scope but flagged). Tree-with-current-state renders cleanly. +6. After the call, creates HL-2025-031 in Paliad. Returns to `/tools/procedures?project=HL-2025-031`. The kontextfrei `with_ccr` state is NOT auto-imported (kontextfrei is per-localStorage, Akte is per-DB); but the brief is over. + +### §12.3 Anna (trainee PA) — finding Klageerwiderung from scratch + +1. Anna opens `/tools/procedures`. No Akte. +2. Entry form radio = "Geführt". R1 event_kind = filing; R2 forum = UPC (autoskipped after R1); R3 PT = upc.inf.cfi (autoskipped — single match); R4 event chip = Klageerwiderung; R5 party = defendant. +3. Entry form collapses to one-line summary. Anchor view renders. +4. Forward walk: Replik (claimant, M), Vorl. Einwendungen (defendant, O). +5. Anna toggles to "Verfahren" view. Sees Klageerwiderung highlighted in the bigger tree — between SoC above and Replik below. Mental model updates. +6. Toggles back to "Anker" view. Notices the "Konstellationen" button. Curious, clicks. Sees `with_ccr` and `with_amend` as togglable; ticks Vorschau on `with_ccr`. Forward walk re-renders with the CCR branch greyed-in-preview. Anna learns CCR branches exist without committing the project. + +### §12.4 m (gardener-of-rules) — sanity-check the cross-cutting Querverweise + +1. m opens `/tools/procedures?event=` (the Klageerwiderung sequencing_rule UUID). +2. Anchor view. Anchor card shows "Querverweise (2)" affordance. +3. m clicks. Drawer expands: `Antrag auf Verfahrensruhen (R.295)` — auch ausgelöst durch: KEW (HIER) | Replik | Duplik | Patentänderungsantrag. m sees the 4-event predecessor union explicitly listed. +4. m clicks "Detail" on R.295 → opens `/admin/procedural-events//edit` in a new tab. +5. m verifies the editorial state of compound_predecessors. Editorial split-review proceeds. + +--- + +## §13 m's decisions (2026-05-27) + +This section will be populated after the AskUserQuestion batches return. The raw question list lives in §14 below as the historical record of what was open. + +--- + +## §14 Open questions for m + +Eleven questions, batched 4 + 4 + 3 for `AskUserQuestion`. Tier 1 = entry UX + anchor shape (the hardest decisions — drives the page geometry). Tier 2 = walks + constellations (load-bearing behaviour). Tier 3 = migration + scope (operational). + +m's picks fold back into §13 above before the "TRACKER DESIGN READY FOR REVIEW" signal. + +### Batch 1 — entry UX + anchor shape + +- **Q1 (Tab UX redo)**: cronus's design picked "all 4 tabs visible at once" and that demonstrably caused friction. Replace with — (a) **single-pane entry form, radio-revealed sub-forms**, (b) **mutually-exclusive tabs with reset-on-switch**, (c) **drawer-overlay entry** above a blank Anchor-view canvas. (Inventor pick: a) +- **Q2 (Anchor visualisation)**: the "you are here" shape — (a) **vertical waterfall, anchor at the centre line**, (b) **sticky horizontal "you are here" chip strip with vertical tree below**, (c) **card-as-frame** with predecessors in top border and tree below. (Inventor pick: a) +- **Q3 (Default landing view when an anchor exists)**: (a) **Anchor view** (backward + self + forward), (b) **Proceeding view** (today's tree with anchor highlighted), (c) **Constellation view** (multi-branch overview). (Inventor pick: a) +- **Q4 (Conditional rules in forward walk default)**: (a) **hide unless flag set + "Bedingte anzeigen" toggle**, (b) **show all conditional greyed with flag hint**, (c) **hide and surface only in the Konstellationen drawer**. (Inventor pick: a) + +### Batch 2 — walks + constellations + +- **Q5 (Backward walk default depth)**: (a) **3 hops, "Weitere Vorgeschichte" to expand**, (b) **2 hops**, (c) **full chain to root, always**. (Inventor pick: a) +- **Q6 (Akte backward-walk semantics)**: (a) **Actuals-overlaid template chain** (parent_id walk, each node's card carries Akte deadline state), (b) **Pure actuals** (only nodes with a `paliad.deadlines` row), (c) **Two-section split** (actuals above, template below, anchor between). (Inventor pick: a) +- **Q7 (Constellation viewer shape)**: (a) **Inline per-flag preview drawer + "Konstellation übernehmen" CTA**, (b) **Side-by-side branch comparison** (two columns: current vs alt), (c) **Full-page swap with breadcrumb back**. (Inventor pick: a) +- **Q8 (Compound rules treatment)**: (a) **Hidden in walks, surfaced in "Querverweise (N)" drawer per anchor**, (b) **Inline at appropriate anchor points with "(auch ausgelöst durch X, Y)" annotation**, (c) **Separate top-level "Übergreifende Regeln" section, always visible**. (Inventor pick: a) + +### Batch 3 — migration + Akte + sub-views + +- **Q9 (Migration path)**: (a) **Flag-gated dev under `?tracker=1`, then hard-cut at T5** (cronus precedent), (b) **Replace immediately at T1, no flag** — riskier but no half-shipped UI for ~weeks, (c) **Parallel URL `/tools/procedures-v2` during dev**. (Inventor pick: a) +- **Q10 (Akte default anchor source)**: (a) **Latest completed deadline → fallback to next open → fallback to proceeding root**, (b) **Explicit picker every visit**, (c) **Last-viewed anchor per Akte (localStorage)**. (Inventor pick: a) +- **Q11 (Stance grouping retention)**: m's bug #3 said Proaktiv/Gericht/Reaktiv columns "don't carry workflow weight". For the Proceeding view — (a) **Drop the 3-column swimlane as a default; keep as opt-in "Schwimmbahnen" toggle for side-comparison**, (b) **Drop entirely — vertical waterfall everywhere**, (c) **Keep 3-column as Proceeding view default; tracker only changes the Anchor view**. (Inventor pick: a) + +--- + +## §15 Out of scope + +- Calculator changes (`pkg/litigationplanner.CalculateRule`). Working as-is. +- Editorial backfill (curie's t-paliad-333 owns the 7 compound rules + R.109 chain). +- The compound_predecessors column shape itself — locked by curie's editorial workstream, this design is independent. +- `/admin/procedural-events` write surface. +- `/projects/{id}` Verlauf / SmartTimeline — cross-link only. +- youpc.org/deadlines (cross-repo). +- Outlook / Calendar sync UI. +- PDF export of the anchor/proceeding/constellation views (mentioned in §12.2 but not designed). +- Bulk-write affordances beyond `/api/projects/{id}/deadlines/bulk` (existing). +- Multi-project anchor comparison (would live in SmartTimeline at Patent/Litigation/Client level). +- Free-text scenario flag i18n. + +--- + +## §16 Synthesis links + +- **mBrian** (after m's ratification): file as `[synthesis]` linked `triggered_by` t-paliad-337; `related_to` cronus's unified-procedural-events-tool design + atlas's deadline-system-revision + cronus's earlier Fristenrechner overhaul. +- **Cross-refs in this repo**: `docs/design-unified-procedural-events-tool-2026-05-27.md` (cronus), `docs/design-deadline-system-revision-2026-05-27.md` (atlas Phase 2), `docs/design-fristenrechner-overhaul-2026-05-26.md` (cronus 2026-05-26). +- **Gitea**: m/paliad#152 (this design), m/paliad#151 (cronus U0-U4 shipped today), m/paliad#149 (atlas Phase 2), m/paliad#146 (cronus 2026-05-26 Fristenrechner overhaul). +- **Coder phase** (deferred per inventor SKILL): runs after m ratifies via AskUserQuestion. Slice ordering per §11.1. NOT atlas (parked at "TRACKER DESIGN READY FOR REVIEW"). A pattern-fluent Sonnet coder picks up T1 first; T2-T4 in order; T5 gated on a 2-PA sanity check (Anna + Sandra personas covered). From 7554e86673fde1f39397c29e4d1754101babcc22 Mon Sep 17 00:00:00 2001 From: mAi Date: Wed, 27 May 2026 21:05:41 +0200 Subject: [PATCH 2/3] =?UTF-8?q?design(procedures-tracker):=20rewrite=20aft?= =?UTF-8?q?er=20m's=20reframe=20=E2=80=94=20single=20timeline-tree,=20inli?= =?UTF-8?q?ne=20forks,=20no=20view=20toggle=20(t-paliad-337)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit m's grilling-round answers (2026-05-27 21:01): 1. One canonical view (full timeline/tree); zoom is an interaction on it, not a separate view. 2. Forks = everything: scenario flags + optionals + appeal-target + court-set picks. 3. Find = combined affordance: text + pills + result-timelines are one thing. 4. Aux proceedings inline as expandable child timelines. Doc rewritten end-to-end. The first draft's three-view toggle + Konstellationen drawer + Querverweise drawer + split-pane/breadcrumb apparatus collapses into: - Sticky find header (search + pill rows + Akte/date) - N matched proceedings rendered as inline-forked timeline-trees - Anchor pin + opt-in zoom mode (collapses siblings, breadcrumb back) - Aux proceedings expand inline at the spawn point 7 open questions in 4+3 batches for AskUserQuestion. T1-T5 migration unchanged in spirit. --- ...-procedures-workflow-tracker-2026-05-27.md | 830 +++++++----------- 1 file changed, 308 insertions(+), 522 deletions(-) diff --git a/docs/design-procedures-workflow-tracker-2026-05-27.md b/docs/design-procedures-workflow-tracker-2026-05-27.md index d0b170a..3bd1b33 100644 --- a/docs/design-procedures-workflow-tracker-2026-05-27.md +++ b/docs/design-procedures-workflow-tracker-2026-05-27.md @@ -5,644 +5,430 @@ **Inventor:** atlas (shift-1, fresh — name-recycle, not the atlas from earlier today) **Date:** 2026-05-27 **Branch:** `mai/atlas/inventor-extend-tools` -**Status:** Draft — coder gate held; m to ratify via `AskUserQuestion` before any coder shift. +**Status:** Draft — coder gate held; m to ratify the remaining open questions via `AskUserQuestion` before any coder shift. **Builds on:** - `docs/design-unified-procedural-events-tool-2026-05-27.md` (cronus's U0-U4 design, shipped today as `/tools/procedures`) - `docs/design-deadline-system-revision-2026-05-27.md` §3.3 + §3.3a (atlas Phase 2 model layer + view-mode toggle) - `docs/design-fristenrechner-overhaul-2026-05-26.md` (cronus 2026-05-26 Mode A+B+result, shipped via t-paliad-322) ---- - -## §0 Premises — what shipped today, what m hit, what this design does - -### §0.1 What's on prod right now (verified live) - -Today's `/tools/procedures` (U0-U4 shipped via m/paliad#151, knuth, 1718ea2) is a **catalog browser**: - -- One page, **4 always-visible tabs** at the top: "Verfahren wählen" / "Direkt suchen" / "Geführt" / "Aus Akte". -- A shared top-of-page filter strip (search box + 4 chip rows for forum / proceeding / event kind / party). Chip hydration unwired in U0; the search box is markup-only. -- "Verfahren wählen" tab boots the Verfahrensablauf 3-step wizard (pick PT → set perspective+date → result tree with `mandatory_only` / `selected` / `all_options` toggle). -- "Direkt suchen" boots Mode A search; "Geführt" boots Mode B wizard; "Aus Akte" is a placeholder. -- All entry tabs converge on the linear result view (`#fristen-overhaul-root`) for "what's next after this event", or the Verfahrensablauf tree for "what's the whole shape of proceeding X". -- Two output paths: TREE (proceeding-anchored, Verfahrensablauf) and LINEAR (event-anchored, Mode A/B result view). - -**Live data the tracker has to work against** (verified 2026-05-27 against `paliad.sequencing_rules`): - -| metric | value | -|---|--:| -| total rules | 242 (231 published) | -| chained (parent_id not null) | 110 | -| trigger-rooted (trigger_event_id not null) | 78 | -| spawns (cross-PT) | 4 | -| court-set (no computed date) | 47 | -| conditional (condition_expr not null) | 18 — 6 `with_ccr` / 4 `with_amend` / 4 `with_cci` / 4 compound `with_ccr AND with_amend` | -| biggest tree | `upc.inf.cfi` (PT id=8) = 50 rules | - -`paliad.deadlines` carries both `procedural_event_id` and `sequencing_rule_id` per row — so an Akte's "where am I" can be derived from `status='done'` deadlines (the actuals chain) without inferring from rule_code text. - -### §0.2 m's bugs (2026-05-27 20:43 + 20:46) - -> "view proceedings with all possible constellations and the sequences and determine **where we are** in that sequence and **what steps are coming next** for any given procedural event" - -m's specific UX failures in the live page: - -1. **4 tabs visible at once — pre-form leaks across tabs.** Each tab has its own pre-form (PT-picker, search input, R1-R5 wizard, akte-picker). When one is partly filled the others stay half-filled visually under the same filter strip — the page feels like 4 disjoint forms sharing chrome, not one workflow. -2. **Result view fires too many rules.** The linear view dumps every direct child of the anchor — including conditional rules whose flag isn't set, and compound rules (curie's 7 flagged) that join multiple predecessors. A wall of events instead of a focused next-step list. -3. **Proaktiv / Gericht / Reaktiv columns don't carry workflow weight.** The 3-column swimlane (Unsere Seite / Gericht / Gegenseite) is a *stance* grouping, not a *sequence* anchor — useful for side comparison, useless for "where am I in the chain". -4. **No 'you are here' indicator.** The current result view shows children of the anchor but never visualises *the anchor itself* as a position in a larger chain. -5. **Sequence isn't visualised as a sequence.** Flat list grouped by priority, not chained-from-X. - -### §0.3 What this design is and isn't doing - -**Is:** redesign of `/tools/procedures` *surface layer* — entry experience, anchor visualisation, forward/backward walks, constellation viewer, compound-rule treatment, Akte entry. The unified catalog (cronus's U0-U4) is the substrate; the tracker is a new mental model layered on top. - -**Is not:** - -- Schema change. `sequencing_rules` parent_id + condition_expr + is_spawn + is_court_set are sufficient. `paliad.deadlines.procedural_event_id` + `sequencing_rule_id` exist for the actuals chain. No mig. -- Calculator change. -- Editorial backfill (curie's t-paliad-333 still owns the 7 compound rules + R.109 chain). -- `/admin/procedural-events` write surface. -- `/projects/{id}` Verlauf or SmartTimeline — they consume the tracker's output via cross-link, they're not subsumed. -- youpc.org / Outlook sync / PDF export. +**Reframe note (2026-05-27 21:01):** the first draft of this doc overengineered the surface — three-view toggle, separate compound drawer, separate Konstellationen drawer. m re-anchored: "clean display of timelines that have potential forks the user can select. UX should be key. It should be easy to find your thing." This rewrite collapses to a single canonical shape and folds the zoom / constellation / cross-cut concepts into it. The pre-grilling §13 + the 11-Q batch in §14 of the first draft are gone — superseded by m's 4 answers in §0.2 and the smaller open-question set in §10. --- -## §1 The workflow tracker — single conceptual move +## §0 Premises -The tool's central object becomes **the anchor**: one procedural event the user has picked (or arrived at). Everything else is computed against it: +### §0.1 What shipped today and what m hit -- **Backward**: the predecessor chain that led here (parent_id walk, capped depth N). -- **Self**: the anchor card — rule, deadline, party, computed date. -- **Forward**: the successor tree (children rules, filtered by current scenario state). -- **Constellation**: the scenario_flags as togglable predicates, with the option to preview alternative branches. -- **Cross-cuts**: compound rules where this anchor is one of multiple predecessors, surfaced separately. +`/tools/procedures` (U0-U4, knuth, m/paliad#151) is a **catalog browser**: +- 4 always-visible tabs (Verfahren wählen / Direkt suchen / Geführt / Aus Akte). +- Shared filter strip + search box at the top (markup-only in U0). +- Two output shapes — TREE (Verfahrensablauf) and LINEAR (Mode A/B result view) — bound to specific entry tabs. -The shipped page conflates *picking* and *exploring*. The tracker separates them: picking happens once, in a unified entry form; exploring is the whole rest of the page. +m's bugs (2026-05-27 20:43 / 20:46): -### §1.1 Three views, one anchor +1. 4 tabs visible → pre-form leaks across them, page feels like 4 disjoint workflows. +2. Result view fires too many rules incl. conditional-flag-off + curie's 7 compound rules. +3. Proaktiv/Gericht/Reaktiv columns are a stance grouping, not a sequence anchor. +4. No "you are here" marker. +5. Sequence isn't visualised as a sequence — flat priority groups, not chained. -Per m's brief — three plausible shapes for the same anchored state, with toggle: +m's reframe (verbatim, 20:43): "view proceedings with all possible constellations and the sequences and determine **where we are** in that sequence and **what steps are coming next** for any given procedural event." -1. **Anchor view (default)** — single event centred, backward chain above, forward tree below. The "where am I + where am I going" shape. Highest information density per square pixel for the question m posed. -2. **Proceeding view** — entire proceeding tree (current Verfahrensablauf shape), with the anchor highlighted as "you are here". Useful when the user needs to zoom out and see the bigger picture without losing position. -3. **Constellation view** — multi-branch overview. The proceeding tree rendered as N parallel sub-trees, one per known scenario_flag combination relevant to the anchor's proceeding. Browsing/comparison shape, not the daily workflow. +Tightened by m on 21:01: -The user toggles between them via a 3-way segmented control above the output. The anchor persists across toggles; scenario_flags persist; backward/forward depth preference persists. +> "clean display of timelines that have potential forks the user can select. procedural_events that act as triggers for mandatory or optional events. And there is a limited type of proceedings — a sequence of the events builds the proceeding. Some aux proceedings, some main… but a lot is connected. UX should be key. It should be easy to find your thing." -### §1.2 Why "anchor view" beats today's "linear result" + "tree" split +### §0.2 The four m-answers that lock the architecture -The shipped page treats "tree" and "linear" as different *output modes* tied to different *entry tabs*: Verfahren → tree, Direkt/Geführt → linear. But the question m's framing exposes is anchor-relative regardless of entry: "given an event I care about, what's the immediate context?" +Asked back during the grilling round at 20:57, answered 21:01: -The Anchor view answers that uniformly: -- If the user entered via "Direkt suchen" → search lands them on an anchor → Anchor view renders. -- If via Wizard → R4 lands them on an anchor → Anchor view renders. -- If via "Verfahren wählen" → they pick a PT, then a starting anchor inside that PT (default: the proceeding's root event); Anchor view renders. -- If via Akte → anchor derives from the project's most recent completed deadline (§5.3); Anchor view renders. - -Today's two outputs collapse to one, parametrised by anchor. - ---- - -## §2 §A — Tab UX redo - -m's bug #1 — "4 tabs visible at once, pre-form leaks across them". The recommendation in cronus's design ("all four tabs visible") shipped and demonstrably increased friction. The tracker picks a different shape. - -### §2.1 Three candidates - -**(a) Single-pane entry form with reveal-on-pick (Inventor recommendation).** - -One panel above the output area asking "Wie willst du das Ereignis finden?" with four mechanism options as radio chips. The currently-selected mechanism reveals its sub-form inline; others collapse to a one-line summary. Picking a different mechanism collapses the active form and reveals the next one. State persists when switching back (search query stays, wizard answers stay). - -``` -┌─ Ereignis finden ───────────────────────────────────────┐ -│ Wie willst du suchen? │ -│ ( ) Verfahren wählen (•) Direkt suchen │ -│ ( ) Geführt ( ) Aus Akte │ -│ │ -│ [ 🔍 Klageerwiderung______________ ] Filter: UPC · filing │ -│ Ergebnisse: 3 Treffer — pick one to anchor │ -│ • Klageerwiderung (defendant) [upc.inf.cfi] │ -│ • Klageerwiderung (defendant) [upc.rev.cfi] │ -│ • Klageerwiderung (defendant) [upc.dmgs.cfi] │ -└──────────────────────────────────────────────────────────┘ - -┌─ Anker ────────────────────────────────────────────────────┐ -│ (empty until user picks — placeholder: "Wähle ein Ereignis │ -│ oben aus, um Vor- und Nachgeschichte zu sehen") │ -└────────────────────────────────────────────────────────────┘ -``` - -After picking, the entry panel collapses to a one-line summary (`Anker: Klageerwiderung [upc.inf.cfi, defendant] — ändern`) and the Anchor view fills the rest of the page. - -**(b) Mutually-exclusive tabs.** Keep the 4-tab shape but enforce one-at-a-time visible: switching tabs hides all the others' pre-form markup *and resets their inputs*. Solves the leak by force-resetting. Cheap to implement (existing code, drop reset on switch). - -**(c) Drawer-overlay entry.** Page boot lands on an empty Anchor view with a "Ereignis wählen" CTA. Clicking opens a side drawer / overlay sheet containing all 4 mechanisms as collapsible sections. Picking dismisses the drawer; the anchor is set. "Ereignis ändern" reopens the drawer with prior state. - -### §2.2 Trade-offs - -| | (a) single-pane | (b) mutex-tabs | (c) drawer | +| | inventor's grilling question | m's answer | what it locks | |---|---|---|---| -| Solves leak | ✓ (one form visible) | ✓ (force-reset on switch) | ✓ (overlay is modal) | -| Preserves the 4 named mechanisms m wants visible | ✓ (radio cluster) | ✓ (tabs) | ◐ (hidden until opened) | -| Mental model of "page = workflow, not entry" | ✓ (entry is a tight pre-form; anchor is the page) | ◐ (4 tabs still feel like separate workflows) | ✓✓ (page is anchor-first) | -| Switching mechanism friction | low (click radio) | low (click tab) | medium (open drawer, switch section) | -| Mobile | ✓ (radio cluster collapses to chip strip) | △ (4 tabs need scroll) | ✓ (drawer is bottom-sheet) | -| Implementation cost | medium (rebuild entry panel) | low (toggle reset behaviour) | medium-high (new drawer component) | +| 1 | One canonical shape or still 3 views? | "I still want zoomability for one event and all events it triggers. But that can be from within the full timeline/tree as well." | **One canonical view** (full timeline/tree); zoom is an *interaction* on it, not a separate view. The Anchor / Verfahren / Konstellationen toggle is dropped. | +| 2 | What's a "fork" — scenario flags only / +optionals / everything? | "c" (everything: flags + optionals + appeal-target + court-set picks) | **Every choice point in the data is a fork.** Optionals (priority='optional') + conditional flags + appeal-target + perspective + court-set scheduling. Inline pickers. | +| 3 | "Easy to find" — timeline-as-index / search box / proceeding picker first? | "all of these — text search, filter pills, a display of the resulting proceedings timelines" | **Find = combined affordance.** Text search + filter pills + the displayed result *is* the matched proceeding timelines. The page never has chrome that isn't either the find affordance or the timelines themselves. | +| 4 | Aux proceedings inline or drillable? | "inline" | **Aux proceedings draw inline as expandable child timelines** hanging off the spawn point in the parent timeline. The full connected graph is one visible thing. | -**Recommendation: (a)**. The bug isn't "the 4 tabs exist" — it's "the entry form is the dominant chrome of the page when it should be a small pre-flight". A single-pane form with radio-revealed sub-forms keeps the four entry mechanisms named and visible (m's Q3 spirit preserved) while pushing the anchor view into the role of "the page". +### §0.3 Live data the tracker has to work against -(b) is the cheapest patch but doesn't address the deeper issue m flagged: the four tabs visually compete with the output for attention. (c) over-corrects toward modality and hides the named mechanisms behind a CTA. +Verified 2026-05-27 against `paliad.sequencing_rules` (231 published / 242 total): +- 110 chained (parent_id not null) — most rules in a chain. +- 78 trigger-rooted, 4 spawns (cross-PT), 47 court-set, 18 conditional (6 `with_ccr` / 4 `with_amend` / 4 `with_cci` / 4 compound `with_ccr AND with_amend`). +- Biggest single proceeding: `upc.inf.cfi` (50 rules). +- ~46 proceeding types total (UPC 35 / DE 5 / EPA 3 / DPMA 3). +- `paliad.deadlines` carries both `procedural_event_id` and `sequencing_rule_id` → Akte actuals overlay is a direct join. + +### §0.4 Scope + +**In:** redesign the `/tools/procedures` surface as a single timeline-tree view with inline forks + a combined find affordance. + +**Out:** +- Calculator changes. +- Editorial backfill (curie's t-paliad-333 owns the 7 compound rules + R.109 chain). This design is *independent* of curie's column-shape work; compound rules surface inline via parent_id like any other rule, with whatever annotation curie ships. +- `/admin/procedural-events` write surface. +- `/projects/{id}` Verlauf / SmartTimeline — cross-link only. +- youpc.org cross-repo / Outlook sync / PDF export. --- -## §3 §B — Anchor visualisation (you-are-here) +## §1 The single canonical shape -m's bug #4 — "no 'you are here' indicator". The Anchor view's job. - -### §3.1 Three candidates - -**(a) Vertical waterfall with anchor at the centre line (Inventor recommendation).** +One page. One view. Top section = find affordance. Below = matched proceeding timelines, each as an inline-forked tree, vertically stacked. ``` - Vorgeschichte (3 Schritte) - │ - ┌──────────┴──────────┐ - │ Klageerhebung │ ← 60 days ago [SoC · M] - │ (upc.inf.cfi.soc) │ - └──────────┬──────────┘ - │ 3 Monate (R.23.1) - ▼ - ╔═══════════════════════════════════╗ - ║ ▶ Klageerwiderung ║ ← DU BIST HIER - ║ defendant · mandatory · 2026-04-01 ║ [Im Verfahren zeigen] - ║ Frist: R.23.1 (3 Monate) ║ [Konstellationen] - ║ Akte: HL-2024-001 (eingetragen) ║ [Querverweise (2)] - ╚═══════════════════════════════════╝ - │ - ┌──────────┴──────────┐ - ▼ ▼ - ┌─────────────────┐ ┌─────────────────┐ - │ Replik │ │ Vorl. Einwend. │ (Vorschau: 2 Monate) - │ claimant · M │ │ defendant · O │ ← Sofort-Folgen - │ 2026-06-01 │ │ 2026-04-15 │ - └────────┬────────┘ └─────────────────┘ - │ - ▼ - ┌─────────────────┐ - │ Duplik │ - │ defendant · M │ - │ 2026-07-01 │ - └─────────────────┘ +┌────────────────────────────────────────────────────────────────────┐ +│ [🔍 Suche: Klageerwiderung_____________________] │ +│ Forum: [● UPC] [DE] [EPA] [DPMA] │ +│ Verfahren: [● Verletzung] [● Widerklage] [Berufung] [Nichtigkeit] … │ +│ Partei: [Klägerseite] [● Beklagtenseite] │ +│ Akte: HL-2024-001 ▼ Stichtag: 2026-04-01 │ +│ │ +│ 2 Verfahren passen — Anker: Klageerwiderung (HL-2024-001) │ +└────────────────────────────────────────────────────────────────────┘ - ▼ Weitere Folgeketten (4 mehr) ▾ +┌─ upc.inf.cfi · Verletzungsverfahren UPC ─────────────────────────┐ +│ │ +│ ● Klageerhebung (R.13) 2026-01-15 · Klg · M │ +│ │ │ +│ ▼ ● Klageerwiderung (R.23.1) 2026-04-01 · Bekl · M │ +│ │ ━━━━ DU BIST HIER ━━━━ │ +│ │ Optionen für dieses Ereignis: │ +│ │ ☑ Widerklage auf Nichtigkeit │ +│ │ ☐ Antrag Patentänderung (R.30) │ +│ │ ☐ Vorläufige Einwendungen │ +│ │ │ +│ ├─● Replik (R.29.a/b) 2026-06-01 · Klg · M │ +│ │ ├─● Duplik (R.29.c) 2026-07-01 · Bekl · M │ +│ │ └─● Replik auf Defence to CCR (R.29.d) 2026-08-01 · Klg · M │ +│ │ └─● Rejoinder (R.29.e) 2026-09-01 · Bekl · M │ +│ │ │ +│ ├─● Widerklage auf Nichtigkeit ✓ │ +│ │ └─▼ Tochterverfahren upc.rev.cfi ▾ │ +│ │ │ │ +│ │ ├─● Antrag Patentänderung (R.50) optional ☐ │ +│ │ ├─● Hauptverhandlung [Gericht] │ +│ │ └─● Entscheidung [Gericht] │ +│ │ │ +│ └─● Vorläufige Einwendungen ☐ (optional, ausgewählt: nein) │ +│ │ +│ ● Mündliche Verhandlung [Gericht bestimmt] │ +│ │ │ +│ └─● Urteil [Gericht] │ +│ └─▼ Berufungsverfahren upc.apl ▸ (auf Endentscheidung) │ +│ │ +└────────────────────────────────────────────────────────────────────┘ + +┌─ upc.ccr.cfi · Widerklage auf Nichtigkeit (Tochter, oben verlinkt) ┐ +│ … │ +└────────────────────────────────────────────────────────────────────┘ ``` -The anchor is the focal card (boxed, larger, contrasting border). Predecessors fade upward into the page; successors expand downward in a tree. Visual weight = anchor > immediate neighbours > distant chain. +No tabs. No view toggle. The output reacts to the find affordance, the anchor pin, and per-node fork selections. -**(b) Sticky horizontal "you are here" strip.** A breadcrumb-style top band: `... ◄ Klageerhebung — ▶ Klageerwiderung (HERE) — Replik — Duplik ► ...`. Click any chip to re-anchor. Below the strip, vertical forward tree (children only). +### §1.1 The shape's components -Pros: compact, mobile-friendly, breadcrumbs are familiar. Cons: loses chain depth (breadcrumbs are 1D; the predecessor chain isn't always linear — multiple parallel parents at depth 2+ exist). +1. **Find header** (sticky at top): search input + filter pills + Akte/date row + a one-line result summary. §2. +2. **Timeline-trees** (the page body): one block per matched proceeding, full chain + inline forks + inline aux branches. §3-§5. +3. **Anchor pin** (when set): the "DU BIST HIER" band on a specific node, optionally with zoom mode collapsing everything else. §6. -**(c) Card-as-frame.** A large card frames the anchor. Top border embeds the predecessor chain as a slim bar; bottom border opens into the forward tree. Outside the card is the rest of the page. - -Pros: visually obvious where the anchor sits. Cons: card chrome eats vertical space; doesn't scale to long forward trees (where does the card end?). - -### §3.2 Recommendation: (a) vertical waterfall - -It matches m's mental model of "where I came from / where I am / where I'm going" as top-to-bottom chronology. The anchor's visual prominence is unambiguous. Chain depth is preserved naturally. Trees with multiple children fan out cleanly. On mobile, the waterfall collapses to a single column with the anchor card sticky-positioned at viewport top (vertically scrollable predecessors above, successors below). +That's the entire UI surface. No drawers, no separate drillable panes, no constellation viewer. Forks are inline checkboxes; aux proceedings are inline expandable subtrees; zoom is an interaction on the existing rendering. --- -## §4 §C — Forward walk +## §2 The find affordance -m's bug #2 — "result view fires too many rules". The forward walk is the load-bearing affordance for this design; it has to be clean by default and explorable on demand. +m's #3 answer makes this load-bearing: text + pills + result-timelines are all the same affordance. As the user narrows, the timelines below filter; as the timelines change, the result-count summary updates; clicking a node in a timeline auto-narrows the filter pills to that proceeding (optional sugar). -### §4.1 Render rules for the forward walk +### §2.1 Composition -For the anchor `A`, render rules whose `parent_id = A.sequencing_rule_id`. Filter: +| Control | Source | Composes via | Persists in | +|---|---|---|---| +| Free-text search | input box, debounced 200ms | OR-against (procedural_event.name DE/EN, rule_code, aliases) | `?q=` | +| Forum pill row | static enum (UPC/DE/EPA/DPMA), single-select | AND | `?forum=` | +| Verfahren pill row | proceeding_type chips, multi-select (deduped from active forum) | AND (any-of) | `?procs=` | +| Partei pill row | claimant / defendant / both / — (or auto from Akte) | AND | `?party=` | +| Akte picker | dropdown of user's projects | seeds Verfahren + Partei + scenario_flags + anchor | `?project=` | +| Stichtag (date) | date input, defaults today | feeds computed dates throughout the timelines | `?trigger_date=` | -1. **Active constellation**: a rule with `condition_expr` renders iff the expression evaluates to `true` against the current `projects.scenario_flags` (or localStorage equivalent for kontextfrei). Default = hidden. -2. **View-mode** (atlas P3's three-way toggle, reused): "Nur Pflicht" / "Gewählt" (default) / "Alle Optionen". Composes with #1: - - "Nur Pflicht": only `priority='mandatory'`. - - "Gewählt": mandatory + selected per scenario state. Conditional rules visible iff their flag is on. - - "Alle Optionen": every rule the proceeding could fire renders, conditional ones greyed with their flag hint. -3. **Spawn rules** render as a single CTA card `▼ Tochterverfahren öffnen: ` rather than a tree node — clicking re-anchors into the spawned proceeding. -4. **Court-set rules** render in place with the "vom Gericht bestimmt" badge instead of a computed date; included by default in "Gewählt". -5. **Compound rules**: NOT shown inline in the forward walk. Surfaced separately via the "Querverweise (N)" affordance on the anchor card (see §6). +All controls live in one sticky header. The header keeps its height stable so the timelines below don't reflow on every keystroke. -### §4.2 Conditional gates default — three candidates +### §2.2 Cold open behaviour -**(a) Hide unless flag set, with "Bedingte anzeigen" toggle (Inventor recommendation).** Default forward view shows current-constellation rules only. A one-click toggle reveals greyed conditional rules with their flag hint. +No URL params, no Akte: +- Search box empty, all forums neutral, all proceeding pills neutral. Show a curated default of the most-common proceedings: `upc.inf.cfi`, `upc.rev.cfi`, `upc.apl.merits`, `de.inf.lg`, `epa.opp.opd`, `dpma.opp.dpma`. (See Q4 below.) +- A hint above the timelines: "Suche oder filtere, um andere Verfahren einzublenden." -**(b) Show all conditional rules greyed with hint.** Current Verfahrensablauf "Alle Optionen" semantics applied to forward view by default. +With a `?project=` param: filters pre-fill from the Akte, anchor pins to the latest completed deadline. -**(c) Hide and surface in a separate "Andere Konstellationen" drawer.** Conditional rules don't show in the forward walk at all; instead the constellation viewer (§7) handles them. +With a `?q=` or `?event=` param: filters pre-fill to match, single matched proceeding renders pinned. -### §4.3 Recommendation: (a) +### §2.3 What the search matches -m's bug #2 was explicitly "too many rules including conditional whose flag isn't set". (b) reproduces the bug. (c) is too aggressive — the user often wants a quick glance at "what would change if I tick with_ccr". (a) keeps the default clean and gives a one-click reveal. +Free-text search hits the same corpus the existing `/api/tools/fristenrechner/search?kind=events` endpoint covers — procedural_events by name + code + aliases. Spawn-only events stay filtered out (per atlas P0 §2.2). Hits surface in two ways simultaneously: -The reveal toggle composes with the view-mode toggle: -- View-mode = "Nur Pflicht" + Bedingte anzeigen OFF → only mandatory rules with no conditional gate -- View-mode = "Gewählt" + Bedingte anzeigen OFF → default Akte/kontextfrei view, current constellation only -- View-mode = "Alle Optionen" + any → all rules, conditional greyed +- The matched proceeding(s) render expanded with the hit event(s) anchor-pinned. +- A small "Treffer: 3 Ereignisse in 2 Verfahren" summary above the timelines. -### §4.4 Depth cap +If the user types something narrow enough to match a single event, the page auto-pins that event (auto-anchor). If multiple events match, the user picks via a small dropdown under the search input — picking sets the anchor. -Forward walk capped at depth 5 by default (the deepest tree today is `upc.inf.cfi` at depth 4 for the CCR branch). Beyond depth 3, deeper subtrees collapse to a `▼ +N weitere Schritte` chip per branch, clicking expands inline. +### §2.4 Why pills, not chips-with-sub-modes + +The shipped 4-tab UI tried to express "what kind of question are you asking" via tabs. m's answer #3 collapses that — the find affordance doesn't care which "kind" of question; it cares about the active filter set. A user with a search + a forum + an Akte set gets the right timelines regardless of which tab they "came from". The mental model is: narrow the set; the timelines arrive. --- -## §5 §F — Backward walk +## §3 Timelines and forks -m's brief: "default 2-3 hops of predecessors; in Akte mode use actual completed deadlines". +Each matched proceeding renders as one card. Inside the card: the proceeding's name + jurisdiction badge in a thin header strip, then the chain. -### §5.1 Default depth: 3 hops +### §3.1 The chain -Three hops is the right default empirically: -- For `upc.inf.cfi` at the Duplik anchor (depth 3 from SoC), 3 hops shows SoC → Klageerwiderung → Replik → Duplik (anchor). -- For shallower trees (`upc.apl.cost` at depth 1), the chain just renders as 1 hop with no fold-up. -- Beyond 3 hops, a `▲ Weitere Vorgeschichte anzeigen` chip expands the chain upward to the root. +Vertical, top-to-bottom = chronological. Each node = one procedural_event (the rule that fires it lives inside). Edges = parent_id. Per node: -### §5.2 Kontextfrei mode +- **Bullet style** by priority: solid filled (mandatory), solid outline (recommended), dotted (optional), dashed (conditional-flag-off and hidden). +- **Bullet colour**: priority band — black/grey/blue/light depending on the scale we end up picking. Lime accent (`#c6f41c`) reserved for the anchor pin. +- **Inline metadata**: name, rule code, computed date, party badge, priority badge. Stripped to one line. +- **Court-set events**: render with `[Gericht bestimmt]` in date column. +- **Spawn nodes**: terminate the bullet with `▼ Tochterverfahren ▾` — expandable inline; collapsed by default unless the spawn flag is on. §5. -The parent_id chain walked upward from the anchor's sequencing_rule. Each hop renders as a compact card (rule code, event name, primary_party, computed-date-if-trigger-date-set). No deadline state (kontextfrei has no Akte). +### §3.2 Forks — every choice point is one + +A "fork" is anywhere the user can flip the proceeding's shape: + +1. **Scenario flags** (`with_ccr`, `with_amend`, `with_cci`) — currently 3, extensible via curie's `scenario_flag_catalog`. +2. **Optional rules** (`priority='optional'`) — each is a "do I do this?" pick. +3. **Appeal-target picks** — `applies_to_target` array on appeal proceedings (endentscheidung / kostenentscheidung / anordnung / schadensbemessung / bucheinsicht). Per-card chip group at the appeal root. +4. **Perspective** — claimant / defendant per proceeding (mostly comes from Akte's `our_side`, picker overrides). +5. **Court-set timing choices** — `choices_offered` JSON on `sequencing_rules` (`appellant` / `include_ccr` / `skip` shapes from einstein). Per-card chip set. + +**Where forks render.** Inline, *on the node where the fork's effect begins.* Not in a top-of-page flag strip (m's bug #5 — sequences should be visualised as sequences; flags above the tree decouple cause from effect). + +Concretely: the `with_ccr` fork renders as a checkbox **on the Klageerwiderung node**, because that's where the user decides "we are filing a Widerklage with our KEW". Toggling it lights up the CCR child branches below. Similarly: + +- `with_amend` renders on the KEW node *and* on the Antrag-Patentänderung node it gates. +- `with_cci` renders on the Defence-to-Revocation node. +- Optional rules render as a checkbox on their own card. +- Appeal-target picks render on the appeal root. + +If multiple forks share a node, they cluster as a small "Optionen für dieses Ereignis" mini-strip *below* the node header: + +``` +▼ ● Klageerwiderung (R.23.1) 2026-04-01 · Bekl · M + │ Optionen: + │ ☑ Widerklage auf Nichtigkeit + │ ☐ Antrag Patentänderung (R.30) + │ ☐ Vorläufige Einwendungen einlegen +``` + +### §3.3 Default rendering ("Gewählt" semantics) + +Each node renders iff: +- It's mandatory (priority='mandatory'), OR +- It's selected per current scenario state (priority='recommended' unless explicitly deselected; priority='optional' iff explicitly selected; conditional iff flag is on). +- Same as atlas P3's "Gewählt" view-mode. + +Conditional rules whose flag is off **do not render at all** by default. The fork checkbox to *turn the flag on* still appears on the gating node — turning it on causes the dependent branch to render. + +This is m's bug #2 fix: no more dump of every-rule including flag-off conditional. The forks themselves are the affordance that brings hidden branches into view. + +### §3.4 Optional reveal — "Alle Optionen" + +A single toggle at the top of each proceeding card (NOT page-wide): + +``` +[· Gewählt ·] [ Alle Optionen ] +``` + +"Alle Optionen" renders every rule including flag-off conditionals (greyed with their flag hint) and unselected optionals (dotted with `[Aufnehmen]` chip). Useful when the user wants to see the whole shape. Per-proceeding so a page with 3 proceedings can have one in "Alle Optionen" mode without affecting the others. State persists in `localStorage` per proceeding code. + +### §3.5 Why dropping "Nur Pflicht" + +Atlas P3's three-way toggle had Nur Pflicht / Gewählt / Alle Optionen. With forks made inline + per-node, "Nur Pflicht" loses load-bearing — it was useful when the page had no fork interactivity (you wanted to dial down clutter). Now the user can just leave all forks off and see the mandatory-only chain in Gewählt mode. The two-way Gewählt ↔ Alle Optionen is enough. + +### §3.6 Cross-party rows + +Per atlas §2.4 / m's lock: every rule for the proceeding renders, with rows where the user is *not* the primary_party muted + carrying a "Gegenseitig" badge. Same treatment in this tracker. Not hidden by perspective; just visually deemphasised. + +--- + +## §4 Court-set events & date rendering + +`is_court_set=true` rules don't compute a date — the court picks it on the day. Two display options that interact: + +- Render with `[Gericht bestimmt]` in the date column, no date. Standard. +- When the user has scheduled the actual date (an `appointments` row on the project or a manual override), the actual date replaces the badge. Akte-only. + +If the date is "vom Gericht" and matters as a trigger for downstream events, downstream events render `[abhängig von Verhandlung]` instead of a date, and recompute live once the court date is known. + +`choices_offered` per-rule (the 3 known shapes today: `appellant`, `include_ccr`, `skip`) — also inline per-node, treated as forks (§3.2 #5). + +--- + +## §5 Aux proceedings inline + +Per m's #4 answer: spawned proceedings draw inline as expandable subtrees, not as drillable separate pages. + +### §5.1 Render + +A spawn node renders as a leaf chip terminating the parent's chain segment: + +``` +●─● Widerklage auf Nichtigkeit ✓ + └─▼ Tochterverfahren upc.rev.cfi ▾ + │ + ├─● Antrag Patentänderung (R.50) optional ☐ + ├─● Hauptverhandlung [Gericht] + └─● Entscheidung [Gericht] + └─▼ Berufungsverfahren upc.apl ▸ +``` + +- Collapsed by default unless the gating fork is on (e.g. `with_ccr` ticked → CCR's spawn into upc.rev.cfi auto-expands). +- Expanding writes nothing — pure UI state in `sessionStorage["procedures:expanded_spawns"]`. +- The aux subtree renders with the same node vocabulary as the parent; forks inside the aux are independently editable. +- Aux subtrees can themselves have aux subtrees (e.g. CCR → Berufung). Depth is bounded by the data — today 2 levels deep at most. + +### §5.2 Cross-references + +When two paths converge on the same aux proceeding (e.g. CCR triggers from a couple of places), the aux renders inline at the first path's spawn point and renders as a back-reference at subsequent spawn points: `▸ (siehe oben: Tochterverfahren upc.rev.cfi)`. Single source of truth in the rendered tree, even when the graph has multiple edges. ### §5.3 Akte mode -Hybrid — the backward chain integrates with the project's actual completed deadlines. - -For each parent_id hop, query `paliad.deadlines WHERE project_id = $1 AND sequencing_rule_id = $2`: -- **If a deadline exists with `status='done' or status='deleted'`** → render as a "done" card with the actual completion date, audit reason, source ("Akte: 2026-03-15 erledigt"). -- **If a deadline exists in another status** → render with that status badge (open / overdue / in-progress) plus the actual due_date. -- **If no deadline exists** → render as a "Vorlage" (template) card with the computed date if a project-level trigger_date is set, else "(noch nicht eingetragen)". - -This gives m's "the chain backward (parent_id walk) showing the events that led here" both as the template chain (kontextfrei) AND as actuals-overlaid template (Akte). The template and the actuals are the same chain, just with state badges. - -### §5.4 Three candidates for Akte backward semantics - -**(a) Actuals-overlaid template chain (Inventor recommendation).** The template chain walked via parent_id, but each node's card carries the actual deadline state from the project. One render, full information. - -**(b) Pure actuals chain.** Only render nodes for which a `paliad.deadlines` row exists. Anchor's backward chain shows only what's actually happened, no template prediction. - -**(c) Two-section split.** Top section: actuals (completed deadlines from this Akte, chronological). Bottom section: template chain (what the rules say). Anchor card sits between them. - -### §5.5 Recommendation: (a) - -(b) loses information when the user hasn't entered every deadline yet (common — Sandra in §10.3's persona only enters what comes in via CMS). (c) doubles the vertical real estate and creates two parallel mental models. (a) keeps one chain with state badges — honest about what's actual vs template, single read path. +In Akte mode, if the spawn was actualised (a child project exists linked via `parent_project_id`), the aux subtree shows the child project's badge: `📁 HL-2024-001-CCR · Tochterakte`. Clicking the badge navigates to that child project. The subtree itself still renders inline. --- -## §6 §I — Compound rules drawer +## §6 Anchor pin & zoom -The 7 curie-flagged compound rules — rules where a single sequencing_rule has multiple predecessor events (the parent_id model fits 1:N, not N:1). They don't fit cleanly in either the backward chain (which is itself, but for one of N predecessors) or the forward walk (a child of one parent, but with cross-cutting logic that involves siblings of that parent). +m's #1 answer: "zoomability for one event and all events it triggers, from within the full timeline". -### §6.1 Treatment in the tracker +### §6.1 The anchor pin -- **Hidden by default** in both backward and forward walks. Inclusion would clutter the chain with rules whose triggering condition is "X OR Y", visually ambiguous about which path matters. -- **Surfaced via "Querverweise (N)" affordance on the anchor card.** N = count of compound rules where this anchor is one of the multiple predecessors. Click expands an inline drawer listing each compound rule with explicit annotation: +Any node can be pinned as the anchor. Pinning sources: +- URL `?event=` (deep link). +- Search box auto-pin when the search narrows to a single hit. +- Click-to-pin on any node (small pin icon in the node's metadata row). +- Akte landing: auto-pin to latest completed deadline. -``` -┌─ Querverweise (2) ───────────────────────────────────────────┐ -│ Diese Frist betrifft das aktuelle Ereignis auch: │ -│ │ -│ ▸ Antrag auf Verfahrensruhen (R.295) │ -│ auch ausgelöst durch: Klageerwiderung (HIER) | Replik | │ -│ Duplik | Schriftsatzwechsel im Patentänderungsantrag │ -│ Frist: kein fixes Datum (vor MV) [Detail] │ -│ │ -│ ▸ Antrag auf prozessleitende Verfügung (R.333) │ -│ auch ausgelöst durch: jeder Schriftsatzeingang ab SoD │ -│ Frist: 14 Tage nach Schriftsatz [Detail] │ -└────────────────────────────────────────────────────────────────┘ -``` +The pinned node renders with a 4px lime-coloured left band + a `━━ DU BIST HIER ━━` divider above its successors. The pin is also reflected in the find-header's result summary: "Anker: Klageerwiderung (HL-2024-001)". -### §6.2 Wiring +### §6.2 Zoom mode -Compound rules need an explicit marker — currently flagged via curie's editorial pass. Concrete shape (suggestion for the editorial side, not blocking this design): +A small `[ 🔍 Fokus ]` chip on the anchored node toggles zoom mode for that anchor. When zoom is on: -- `paliad.sequencing_rules` gains a nullable `compound_predecessors uuid[]` column. NULL = ordinary parent_id rule. Non-null = list of additional procedural_event_ids that ALSO trigger this rule (parent_id stays as the "primary" predecessor for backward-walk purposes). -- The tracker's `Querverweise` count = count of rules where ` = ANY(compound_predecessors) OR parent_rule.procedural_event_id = `. +- The anchored node's ancestors collapse to a single breadcrumb at the top of the proceeding card: + ``` + upc.inf.cfi ▸ Klageerhebung ▸ ━ Klageerwiderung ━ + ``` +- The anchored node renders full. +- Successors render fully (the forward subtree under the anchor). +- Sibling branches at every ancestor depth collapse to a single-line summary card: `… 4 weitere Schritte verborgen — [zeigen]`. -This is a separate ticket for curie's editorial workstream; the tracker reads whatever column shape lands. For the inventor-deliverable, the *placement* (drawer per anchor) is the design call; the column shape is a heads-up. +This is what m means by "zoom into one event from within the timeline" — the *same view*, just with non-relevant siblings collapsed. Toggle off → full timeline restored, anchor still pinned. -If curie's split-review yields a different column name / shape, the tracker reads that instead. No tracker-side cost to swap. +Zoom is page-scoped (one anchor per page, one zoom state). State in URL: `?event=&zoom=1`. -### §6.3 Three candidates +### §6.3 The "where I came from" question -**(a) Hidden by default, "Querverweise" drawer on anchor card (Inventor recommendation).** +m's brief asked for backward-walk visualisation. Without zoom: the chain above the anchor is the backward walk — it's the same tree. With zoom: the breadcrumb at the top of the proceeding card is the backward walk in compact form. No separate concept; backward walk = upward in the tree. -**(b) Inline at appropriate anchor points in the forward walk.** Compound rules render in-tree at each of their predecessor positions, with a "(auch ausgelöst durch X, Y)" annotation. +### §6.4 Akte mode: actuals overlay -**(c) Separate top-level "Übergreifende Regeln" section above the anchor card.** A persistent section listing all compound rules relevant to the proceeding, regardless of current anchor. +When `?project=` is set, each node in the chain queries `paliad.deadlines WHERE project_id = $p AND sequencing_rule_id = $r` and overlays: -### §6.4 Recommendation: (a) +- `status='done'` → ✓ in the node bullet area + actual completed date in the date column. Greyed slightly to read as "past". +- `status='open'` and `due_date < today` → ⚠ overdue. +- `status='open'` and `due_date >= today` → 📅 actual due date if differs from computed; ◇ marker. +- No deadline row → render as template (current behaviour). -(b) reintroduces m's bug #2 (too many rules in the walk). (c) decouples the cross-cuts from the anchor — but m's framing is anchor-relative ("for any given procedural event"), so cross-cuts should be anchor-scoped. The drawer per anchor is the cleanest match. +The anchor auto-pins to the latest `status='done'` deadline by default — the natural reading is "we just finished this". --- -## §7 §H — Constellation viewer +## §7 What lives where: the find header vs the timelines -m's brief: "alternative-branches drawer. When viewing inf.cfi chain with `with_ccr=false`, surface a 'see what the CCR branch looks like' affordance that overlays the CCR-only rules." +A short table to make the responsibility boundary explicit: -### §7.1 Three candidates +| Concern | Find header | Timeline body | +|---|---|---| +| Pick proceeding(s) | Filter pill row | (auto-rendered after) | +| Pick anchor | Search-narrow → auto-pin / URL `?event=` | Click pin icon on any node | +| Pick perspective | Pill (or auto from Akte) | (read-only — feeds rendering) | +| Pick scenario flags | (no) | Inline fork checkboxes on gating nodes | +| Pick optional rules | (no) | Inline fork checkboxes on each optional node | +| Pick appeal target | (no) | Inline chip group on appeal root | +| Pick date | Stichtag input | (read-only — feeds computed dates) | +| Toggle Alle Optionen / Gewählt | (no) | Per-proceeding 2-way toggle | +| Zoom on anchor | (no) | `[Fokus]` chip on anchored node | +| Akte select | Akte picker | (read-only — feeds actuals overlay) | -**(a) Inline per-flag preview drawer (Inventor recommendation).** On the anchor card, a `[Konstellationen]` button reveals a drawer: - -``` -┌─ Konstellationen ────────────────────────────────────────────┐ -│ Aktuelle Konstellation: with_ccr=false, with_amend=false │ -│ Relevant für dieses Verfahren: │ -│ │ -│ ▸ with_ccr (Widerklage auf Nichtigkeit) aus │ -│ [vorschau] Wenn an: 3 zusätzliche Fristen entstehen, │ -│ inkl. Replik auf Widerklage (claimant, R.29.a, 2 Monate) │ -│ [Konstellation übernehmen] │ -│ │ -│ ▸ with_amend (Antrag auf Patentänderung R.30) aus │ -│ [vorschau] Wenn an: 2 zusätzliche Fristen entstehen, │ -│ inkl. Defence-to-amend (defendant, R.32.1, 2 Monate) │ -│ [Konstellation übernehmen] │ -└────────────────────────────────────────────────────────────────┘ -``` - -Each row carries: flag name + human label, current state, a "Vorschau" toggle that overlays the conditional rules in the forward walk (greyed with the flag hint colour for that flag), and a "Konstellation übernehmen" CTA that actually flips the flag in scenario_flags. - -**(b) Side-by-side branch comparison.** A two-column layout: left = current constellation forward tree, right = "with_ccr=true" forward tree. Toggle right pane between known scenarios. - -Pros: literal visual diff. Cons: doubles horizontal space; mobile-impossible; rare workflow (m's actual question is mostly "what would change if X", not "compare A vs B side by side"). - -**(c) Full-page swap with breadcrumb.** Click a flag → page swaps the forward tree to that constellation's view; breadcrumb back to current. - -Pros: simple. Cons: loses current constellation visibility while exploring; the comparison isn't visual, only mental. - -### §7.2 Recommendation: (a) - -It matches the exact pattern m described ("surface a 'see what the CCR branch looks like' affordance that overlays the CCR-only rules"). The preview toggle is non-committal (no state change unless user explicitly takes the constellation); the "Konstellation übernehmen" CTA is the explicit write. - -Scoping: only flags relevant to the anchor's proceeding render in the drawer (deduced from condition_expr usage across the proceeding's rule set). E.g., `upc.dmgs.cfi` doesn't carry `with_ccr` — the drawer is hidden or empty for anchors there. - -### §7.3 "Constellation view" (the third top-level view) - -The full Constellation view (§1.1 #3) is a separate render mode reached via the top toggle, intended for *browsing* the constellation matrix without committing. It shows the proceeding's whole tree N times in parallel mini-panes, one per relevant flag combination: - -``` -┌─ ohne Optionen ─────────┐ ┌─ with_ccr ──────────────┐ -│ SoC │ │ SoC │ -│ ├─ KEW │ │ ├─ KEW + CCR │ -│ │ └─ Replik │ │ │ ├─ Replik (no-ccr) │ -│ │ └─ Duplik │ │ │ └─ Replik-to-CCR (+) │ -│ └─ (keine Folgen) │ │ │ └─ Rejoinder │ -│ │ │ └─ App-to-amend (R.30)? │ -└──────────────────────────┘ └──────────────────────────┘ -┌─ with_amend ────────────┐ ┌─ with_ccr + with_amend ──┐ -│ SoC │ │ SoC │ -│ ├─ KEW + App-to-amend │ │ ├─ KEW + CCR + Amend │ -│ │ ├─ Defence-to-amend │ │ │ ├─ Defence-to-amend │ -│ │ └─ Replik │ │ │ └─ Replik-to-CCR │ -└──────────────────────────┘ └──────────────────────────┘ -``` - -This is the "view all constellations at a glance" shape; rare use, but useful for the Friday-brief partner persona (§10.2 of cronus's design). Mobile: stacks vertically. +Find header = "narrow the set + global context". Timelines = "everything per-event". No drawers, no overlays. --- -## §8 §D — Three views toggle +## §8 Cold open + empty state -The top of the output carries a 3-way segmented control: +Cold open with no Akte, no URL params (Q4 below): show a curated default of 6 most-common proceedings (`upc.inf.cfi`, `upc.rev.cfi`, `upc.apl.merits`, `de.inf.lg`, `epa.opp.opd`, `dpma.opp.dpma`), each rendered with default Gewählt + no forks selected + no anchor. Hint text above: "Suche oder filtere, um andere Verfahren zu sehen." -``` -┌─ Ansicht ──────────────────────────────────────────────┐ -│ (•) Anker ( ) Verfahren ( ) Konstellationen │ -└────────────────────────────────────────────────────────┘ -``` - -### §8.1 Anchor view (default) - -Per §3 + §4 + §5. The "where am I + where am I going" canonical shape. - -### §8.2 Proceeding view - -The current Verfahrensablauf tree (atlas P3 shape), with the anchor highlighted. Same view-mode toggle (Nur Pflicht / Gewählt / Alle Optionen). The "you are here" treatment: - -- The anchor card gets a vertical band stripe down its left edge in the lime accent colour (`#c6f41c`, the brand colour). -- Auto-scroll-into-view on toggle to Proceeding mode, with smooth scroll. -- Crumb above the tree: `📍 Anker: Klageerwiderung — [zur Ankeransicht]`. -- The 3-column swimlane (existing "Schwimmbahnen" toggle from atlas P3) remains as an optional sub-view within Proceeding view, NOT a top-level view of its own. Stance grouping is orthogonal to position in chain (m's bug #3). - -### §8.3 Constellation view - -Per §7.3. Mini-panes per relevant flag combination, each a compact rendering of the proceeding tree under that combination. The anchor is highlighted in every pane that contains it. Browsing/comparison shape; less common. - -### §8.4 Why three and not two - -Anchor + Proceeding cover the "where am I" and "zoom out" needs. The third (Constellation) is m's explicit framing requirement ("view proceedings with all possible constellations"). Skipping it would leave that piece in the per-flag drawer (§7.1), which is anchor-relative — not the "view all constellations" overview. +Empty filter result (e.g. user types nonsense): zero timelines render, with a helper card: "Keine Treffer. Filter zurücksetzen ▸" --- -## §9 §J — Akte entry +## §9 Migration -m's brief: "when user arrives from /projects/{id}, derive anchor from the project's latest completed deadline (or selectable). Wire through P0 SSoT." - -### §9.1 Anchor derivation - -When the user navigates to `/tools/procedures?project=` (or picks the Akte from the Akte picker mid-flight): - -1. Load `projects` row → proceeding_type_id, our_side, scenario_flags. Pre-fill perspective + constellation. -2. Query `paliad.deadlines WHERE project_id = $project AND sequencing_rule_id IS NOT NULL ORDER BY completed_at DESC NULLS LAST, due_date DESC LIMIT 1`: - - If row found with `completed_at IS NOT NULL` → anchor = that rule's sequencing_rule_id. Trigger date = `completed_at::date`. - - If row found but `completed_at IS NULL` → anchor = that rule. Trigger date = `due_date` (the *next* open deadline). - - If no rows → anchor = proceeding's root sequencing_rule (parent_id IS NULL, sequence_order = MIN). Trigger date = today (or project's `start_date` if set). - -### §9.2 Anchor switch within an Akte - -Once landed, the user can switch the anchor: - -- Click any forward-walk node → it becomes the new anchor (re-anchors the whole view). -- "Anker ändern" button on the anchor card → reopens the entry form panel for re-selection. -- URL-deep-link param `?event=` overrides the derivation. - -The chosen anchor doesn't write back to the project — anchor is a UI-state thing per session, not project metadata. Scenario_flags writes do persist (as today, via `PATCH /api/projects/{id}/scenario-flags`). - -### §9.3 Cross-link from project Verlauf - -Each row in `/projects/{id}` Verlauf renders an action chip "▸ Im Verfahren zeigen" → links to `/tools/procedures?project=&event=`. The tracker opens with that exact event anchored. - -Existing related cross-link (cronus's design §3.2 / §8 cross-pivot) — preserved. - -### §9.4 Three candidates for Akte default anchor - -**(a) Latest completed deadline (Inventor recommendation).** Falls back to next open, then to proceeding root. - -**(b) Explicit picker every visit.** Akte landing → entry form with the Akte's proceeding pre-filled but no anchor yet; user picks each visit. - -**(c) Last-viewed anchor per Akte (localStorage).** Remember the user's last anchor for this project, restore on re-entry. - -### §9.5 Recommendation: (a) - -(a) is the lowest-friction landing for the modal Sandra-paralegal workflow ("today's Hinweisbeschluss came in, where am I now?"). (b) adds a click every visit. (c) is plausible but adds hidden state — the user can't tell why they're landing on this anchor. - -(a) + the explicit "Anker ändern" affordance covers (b) and (c) as opt-ins. - ---- - -## §10 §E — Compound rules: deferral - -The 7 compound rules curie flagged for m's split-review are NOT part of this design's editorial scope. The tracker's job is: - -1. Render the Querverweise drawer per anchor (§6.1) — the *placement* decision. -2. Read whatever column shape curie's editorial workstream lands on for the cross-cutting marker. - -If curie's editorial pass yields `compound_predecessors uuid[]` (§6.2 suggestion), the tracker reads it. If a different shape (a separate `paliad.compound_rule_predecessors` join table, say) — same drawer, different query. - -The 7 specific rules curie flagged (per memory `b6a11b55` and the editorial backlog) need m's split-review before the column shape locks. This design doesn't force a column shape; it locks the *surface placement*. - ---- - -## §11 §K — Migration plan - -### §11.1 The shape - -5-slice train, all surface-layer, no DB mig (modulo the curie editorial column for compound rules, which is a separate workstream): +5 slices, all surface, no DB mig. All independent of curie's editorial work — compound rules render inline via parent_id like any other rule; if curie ships a `compound_predecessors uuid[]` column later, those rules can render at multiple positions (one inline per predecessor) without tracker code changes beyond the join. | Slice | What ships | Reversible? | |---|---|---| -| **T1 — Tracker scaffolding behind `?tracker=1`** | New `procedures-tracker.ts` mounts under the entry form. URL flag `?tracker=1` toggles. Existing 4-tab UI stays the default. | Yes — flag-gated | -| **T2 — Anchor view + backward + forward walks (kontextfrei)** | The waterfall (§3) + N-hop backward (§5.2) + scenario-aware forward (§4) without Akte hookup. Works on any `?event=&trigger_date=&party=` URL. | Yes — code-only | -| **T3 — Akte entry + actuals overlay** | `?project=` derives anchor (§9.1), backward walk overlays Akte deadlines (§5.3), scenario_flags load from project, write-back via existing endpoints. | Yes — code-only | -| **T4 — Constellation drawer (§7) + Constellation view (§7.3) + Proceeding view (§8.2) + view toggle (§8)** | The 3-way toggle, plus the per-flag drawer + multi-pane overview + you-are-here marker on the existing Verfahrensablauf tree. | Yes — code-only | -| **T5 — Hard cut: `?tracker=1` becomes default + drop catalog tabs** | `procedures.tsx` rewrites to mount the tracker shell only. Legacy entry-tab logic in `procedures.ts` deleted. Sidebar / cmd-K unchanged (URL same). | Reversible by revert PR | +| **T1 — Tracker page behind `?tracker=1`** | New `procedures-tracker.ts` mounts under a `?tracker=1` URL flag on `/tools/procedures`. Existing 4-tab UI stays default. | Yes — flag-gated | +| **T2 — Find header + multi-proceeding render** | Sticky header (search + pill rows + Akte + Stichtag) + render N matched proceedings as inline-forked trees (no aux expansion yet, no zoom). Forks: scenario flags + optionals. Default = Gewählt. | Yes — code-only | +| **T3 — Aux proceedings inline + appeal-target + court-set choices** | Spawn nodes expand inline (§5), appeal-target chip group on appeal root, `choices_offered` shapes wired. | Yes — code-only | +| **T4 — Anchor pin + zoom + Akte actuals overlay** | URL `?event=` pin, click-to-pin, `[Fokus]` chip per anchor, Akte deadlines join for status badges (§6.4). | Yes — code-only | +| **T5 — Hard-cut: tracker becomes the page** | `procedures.tsx` rewritten — tracker shell only. Legacy entry-tab logic in `procedures.ts` deleted. `/tools/procedures?mode=…` URL params 301-mapped to the new tracker URLs. Sidebar/cmd-K unchanged. | Reversible only by revert PR | -### §11.2 Why flag-gated dev + hard cut - -m's Q11 precedent on cronus's design — internal user base (~50 lawyers), direct comm absorbs the cut cost, no 2-week dual ship. The tracker is even less of a URL change than U4 was (same `/tools/procedures`, different page shape). The flag-gated dev period (T1-T4) lets curie + m + 2 PA sanity-check before T5 hard-cut. - -### §11.3 What stays unchanged - -- URL: `/tools/procedures` keeps it. -- Sidebar entry "Verfahren & Fristen" keeps it. -- cmd-K palette keeps it. -- All knowledge-platform tools, projects, deadlines, calendars — untouched. -- Calculator (`pkg/litigationplanner.CalculateRule`) — untouched. - -### §11.4 Out-of-band dependencies - -- The compound-predecessors column shape (§6.2) is owned by curie's editorial workstream. Tracker reads whatever lands. If it slips past T4, the Querverweise drawer ships with `compound_predecessors = []` for everyone and the count badge is always 0 — degraded gracefully. -- The Akte actuals overlay (§5.3) reads `paliad.deadlines.sequencing_rule_id`. The column exists today; nothing new. - -### §11.5 Test surface - -Per slice, manual + Playwright smoke: - -- T1: feature flag toggles correctly; both views render. -- T2: kontextfrei anchor view → predecessor chain depth varies by anchor pick; scenario flags toggle conditional rules; spawn rules render as CTA. -- T3: Akte landing derives anchor; actuals overlay shows status badges; write-back persists. -- T4: view toggle preserves anchor; Proceeding view scrolls to anchor; Constellation drawer previews flag flips. -- T5: legacy URL params (`?mode=…`) still work via 301 → mapped to anchor/proceeding entries on tracker. +The flag-gated dev period (T1-T4) gives m + 2 PAs a chance to sanity-check before T5. m's cronus-Q11 precedent (hard cut, no dual-ship) applies — the audience is ~50 internal lawyers. --- -## §12 Worked examples — 4 personas +## §10 Open questions for m -### §12.1 Sandra (paralegal) — Akte landing on Hinweisbeschluss day +Seven questions in 2 batches (4 + 3) for `AskUserQuestion`. Tier 1 = how the per-node fork UI feels + how zoom interacts with multi-proceeding pages. Tier 2 = cold-open content + Akte default + Stichtag scope + migration cadence. -1. Sandra opens HL-2024-001 in Paliad. Project Verlauf shows yesterday's "Klageerwiderung" deadline now `status=done` (Sandra ticked it after the filing came in). -2. She opens `/tools/procedures?project=HL-2024-001`. Tracker derives anchor = Klageerwiderung (sequencing_rule), trigger_date = yesterday (completed_at). -3. Anchor view: - - Backward chain: SoC (done, dated, badged) → Klageerwiderung (anchor, completed) - - Forward walk: Replik (claimant, 2026-06-01, mandatory) → Duplik (defendant, 2026-07-01) - - Optional fan-out: Vorl. Einwendungen (defendant, 2026-04-15) -4. Today's Hinweisbeschluss came in. She types "Hinweis" in the entry-form search (top of page, always available). 1 hit: `upc.inf.cfi.cmo_review`. Click → re-anchors the view; new anchor = Hinweisbeschluss, trigger_date = today. -5. Anchor view re-renders: - - Backward: shows the chain back to Klageerwiderung (which is parent_id of Hinweisbeschluss in the rule graph). 3 hops total. - - Forward: `upc.inf.cfi.cmo_review_resp` (Antrag CMO-Überprüfung), 14 Tage from today. -6. She ticks "In Akte speichern" (the linear-result write-back affordance, embedded as a footer button on the forward walk). Deadline inserted. +m's picks fold back into §11 below before the "TRACKER DESIGN READY FOR REVIEW" signal. -Total clicks: 5 (open tool, type search, click result, tick, save). +### Batch 1 — fork UI + zoom + cross-party +- **Q1 (Fork-cluster shape on a node)** — when a node has 2-4 forks (e.g. Klageerwiderung: `with_ccr` + `with_amend` + Vorl. Einwend.) — (a) inline checkbox list below the node header (current sketch), (b) collapsed "Optionen (3) ▾" affordance that expands on hover/click, (c) chip strip on the same line as the node header. +- **Q2 (Zoom interaction)** — `[Fokus]` chip on the anchored node — (a) collapses siblings to one-line summaries (current sketch), (b) outright hides siblings, breadcrumb-only, (c) split-view (zoomed pane below original full tree). +- **Q3 (Anchor scope on a multi-proceeding page)** — when 3 timelines are visible and the user pins an anchor in one — (a) the other 2 timelines stay expanded normally (no zoom effect on them), (b) the other 2 timelines auto-collapse to header-only ("upc.rev.cfi ▸ ausblenden — [zeigen]"), (c) the other 2 timelines reorder to bottom of page (anchored proceeding floats to top). +- **Q4 (Cold-open default content)** — opening `/tools/procedures` with no URL params and no Akte — (a) the 6-curated-default-proceedings sketch (Verletzung UPC + DE LG, Nichtigkeit UPC, Berufung UPC, EPA-Einspruch, DPMA-Einspruch), (b) all ~46 proceedings rendered with all forks off (lots of scrolling), (c) empty state with a "Filter wählen, um Verfahren einzublenden" prompt. -### §12.2 Becker (senior partner) — Friday client brief on full UPC infringement ablauf - -1. Becker opens `/tools/procedures`. No Akte. Entry form radio set to "Verfahren wählen". -2. Picks `upc.inf.cfi` chip. Anchor defaults to the proceeding root (SoC). Trigger date = today. -3. Top toggle: "Verfahren" view. Full tree renders, anchor = SoC highlighted at top. -4. Becker wants to brief the CCR scenario. Anchor card → "Konstellationen" drawer → ticks `with_ccr` "Konstellation übernehmen". Tree re-renders with CCR branch lit up. -5. Cmd-P / "Drucken" (out of scope but flagged). Tree-with-current-state renders cleanly. -6. After the call, creates HL-2025-031 in Paliad. Returns to `/tools/procedures?project=HL-2025-031`. The kontextfrei `with_ccr` state is NOT auto-imported (kontextfrei is per-localStorage, Akte is per-DB); but the brief is over. - -### §12.3 Anna (trainee PA) — finding Klageerwiderung from scratch - -1. Anna opens `/tools/procedures`. No Akte. -2. Entry form radio = "Geführt". R1 event_kind = filing; R2 forum = UPC (autoskipped after R1); R3 PT = upc.inf.cfi (autoskipped — single match); R4 event chip = Klageerwiderung; R5 party = defendant. -3. Entry form collapses to one-line summary. Anchor view renders. -4. Forward walk: Replik (claimant, M), Vorl. Einwendungen (defendant, O). -5. Anna toggles to "Verfahren" view. Sees Klageerwiderung highlighted in the bigger tree — between SoC above and Replik below. Mental model updates. -6. Toggles back to "Anker" view. Notices the "Konstellationen" button. Curious, clicks. Sees `with_ccr` and `with_amend` as togglable; ticks Vorschau on `with_ccr`. Forward walk re-renders with the CCR branch greyed-in-preview. Anna learns CCR branches exist without committing the project. - -### §12.4 m (gardener-of-rules) — sanity-check the cross-cutting Querverweise - -1. m opens `/tools/procedures?event=` (the Klageerwiderung sequencing_rule UUID). -2. Anchor view. Anchor card shows "Querverweise (2)" affordance. -3. m clicks. Drawer expands: `Antrag auf Verfahrensruhen (R.295)` — auch ausgelöst durch: KEW (HIER) | Replik | Duplik | Patentänderungsantrag. m sees the 4-event predecessor union explicitly listed. -4. m clicks "Detail" on R.295 → opens `/admin/procedural-events//edit` in a new tab. -5. m verifies the editorial state of compound_predecessors. Editorial split-review proceeds. +### Batch 2 — Akte semantics + Stichtag + migration +- **Q5 (Akte landing — default anchor)** — `?project=` — (a) auto-pin to latest `status='done'` deadline (current sketch), (b) auto-pin to next-open deadline (forward-looking), (c) no auto-pin, just pre-fill filters + actuals overlay, user picks anchor. +- **Q6 (Stichtag scope)** — date input in the find header — (a) global, feeds all visible proceedings' computed dates (current sketch — useful for browsing "if today were the trigger"), (b) per-proceeding (each timeline carries its own date input), (c) only valid in single-proceeding mode (hidden when the page shows >1 proceeding). +- **Q7 (Migration cadence)** — (a) flag-gated dev under `?tracker=1`, T1-T4 ship, T5 hard-cut (current sketch, cronus precedent), (b) direct replace at T1 (no flag — every slice ships visibly to users), (c) parallel URL `/tools/procedures-v2` until hard-cut. --- -## §13 m's decisions (2026-05-27) +## §11 m's decisions (2026-05-27) -This section will be populated after the AskUserQuestion batches return. The raw question list lives in §14 below as the historical record of what was open. +To be populated after AskUserQuestion returns. Until then, the inventor picks above govern. --- -## §14 Open questions for m +## §12 Out of scope -Eleven questions, batched 4 + 4 + 3 for `AskUserQuestion`. Tier 1 = entry UX + anchor shape (the hardest decisions — drives the page geometry). Tier 2 = walks + constellations (load-bearing behaviour). Tier 3 = migration + scope (operational). - -m's picks fold back into §13 above before the "TRACKER DESIGN READY FOR REVIEW" signal. - -### Batch 1 — entry UX + anchor shape - -- **Q1 (Tab UX redo)**: cronus's design picked "all 4 tabs visible at once" and that demonstrably caused friction. Replace with — (a) **single-pane entry form, radio-revealed sub-forms**, (b) **mutually-exclusive tabs with reset-on-switch**, (c) **drawer-overlay entry** above a blank Anchor-view canvas. (Inventor pick: a) -- **Q2 (Anchor visualisation)**: the "you are here" shape — (a) **vertical waterfall, anchor at the centre line**, (b) **sticky horizontal "you are here" chip strip with vertical tree below**, (c) **card-as-frame** with predecessors in top border and tree below. (Inventor pick: a) -- **Q3 (Default landing view when an anchor exists)**: (a) **Anchor view** (backward + self + forward), (b) **Proceeding view** (today's tree with anchor highlighted), (c) **Constellation view** (multi-branch overview). (Inventor pick: a) -- **Q4 (Conditional rules in forward walk default)**: (a) **hide unless flag set + "Bedingte anzeigen" toggle**, (b) **show all conditional greyed with flag hint**, (c) **hide and surface only in the Konstellationen drawer**. (Inventor pick: a) - -### Batch 2 — walks + constellations - -- **Q5 (Backward walk default depth)**: (a) **3 hops, "Weitere Vorgeschichte" to expand**, (b) **2 hops**, (c) **full chain to root, always**. (Inventor pick: a) -- **Q6 (Akte backward-walk semantics)**: (a) **Actuals-overlaid template chain** (parent_id walk, each node's card carries Akte deadline state), (b) **Pure actuals** (only nodes with a `paliad.deadlines` row), (c) **Two-section split** (actuals above, template below, anchor between). (Inventor pick: a) -- **Q7 (Constellation viewer shape)**: (a) **Inline per-flag preview drawer + "Konstellation übernehmen" CTA**, (b) **Side-by-side branch comparison** (two columns: current vs alt), (c) **Full-page swap with breadcrumb back**. (Inventor pick: a) -- **Q8 (Compound rules treatment)**: (a) **Hidden in walks, surfaced in "Querverweise (N)" drawer per anchor**, (b) **Inline at appropriate anchor points with "(auch ausgelöst durch X, Y)" annotation**, (c) **Separate top-level "Übergreifende Regeln" section, always visible**. (Inventor pick: a) - -### Batch 3 — migration + Akte + sub-views - -- **Q9 (Migration path)**: (a) **Flag-gated dev under `?tracker=1`, then hard-cut at T5** (cronus precedent), (b) **Replace immediately at T1, no flag** — riskier but no half-shipped UI for ~weeks, (c) **Parallel URL `/tools/procedures-v2` during dev**. (Inventor pick: a) -- **Q10 (Akte default anchor source)**: (a) **Latest completed deadline → fallback to next open → fallback to proceeding root**, (b) **Explicit picker every visit**, (c) **Last-viewed anchor per Akte (localStorage)**. (Inventor pick: a) -- **Q11 (Stance grouping retention)**: m's bug #3 said Proaktiv/Gericht/Reaktiv columns "don't carry workflow weight". For the Proceeding view — (a) **Drop the 3-column swimlane as a default; keep as opt-in "Schwimmbahnen" toggle for side-comparison**, (b) **Drop entirely — vertical waterfall everywhere**, (c) **Keep 3-column as Proceeding view default; tracker only changes the Anchor view**. (Inventor pick: a) - ---- - -## §15 Out of scope - -- Calculator changes (`pkg/litigationplanner.CalculateRule`). Working as-is. -- Editorial backfill (curie's t-paliad-333 owns the 7 compound rules + R.109 chain). -- The compound_predecessors column shape itself — locked by curie's editorial workstream, this design is independent. -- `/admin/procedural-events` write surface. -- `/projects/{id}` Verlauf / SmartTimeline — cross-link only. -- youpc.org/deadlines (cross-repo). -- Outlook / Calendar sync UI. -- PDF export of the anchor/proceeding/constellation views (mentioned in §12.2 but not designed). -- Bulk-write affordances beyond `/api/projects/{id}/deadlines/bulk` (existing). -- Multi-project anchor comparison (would live in SmartTimeline at Patent/Litigation/Client level). +- Calculator changes. +- Editorial backfill (curie's t-paliad-333). Compound rules render inline as parent_id-chained rules with curie's annotation; no special tracker treatment. +- `/admin/procedural-events`, `/projects/{id}` Verlauf / SmartTimeline. +- youpc.org / Outlook / PDF export. +- Multi-project anchor comparison. - Free-text scenario flag i18n. --- -## §16 Synthesis links +## §13 Synthesis links - **mBrian** (after m's ratification): file as `[synthesis]` linked `triggered_by` t-paliad-337; `related_to` cronus's unified-procedural-events-tool design + atlas's deadline-system-revision + cronus's earlier Fristenrechner overhaul. -- **Cross-refs in this repo**: `docs/design-unified-procedural-events-tool-2026-05-27.md` (cronus), `docs/design-deadline-system-revision-2026-05-27.md` (atlas Phase 2), `docs/design-fristenrechner-overhaul-2026-05-26.md` (cronus 2026-05-26). -- **Gitea**: m/paliad#152 (this design), m/paliad#151 (cronus U0-U4 shipped today), m/paliad#149 (atlas Phase 2), m/paliad#146 (cronus 2026-05-26 Fristenrechner overhaul). -- **Coder phase** (deferred per inventor SKILL): runs after m ratifies via AskUserQuestion. Slice ordering per §11.1. NOT atlas (parked at "TRACKER DESIGN READY FOR REVIEW"). A pattern-fluent Sonnet coder picks up T1 first; T2-T4 in order; T5 gated on a 2-PA sanity check (Anna + Sandra personas covered). +- **Cross-refs in this repo**: `docs/design-unified-procedural-events-tool-2026-05-27.md` (cronus, U0-U4 shipped today), `docs/design-deadline-system-revision-2026-05-27.md` (atlas Phase 2), `docs/design-fristenrechner-overhaul-2026-05-26.md` (cronus 2026-05-26). +- **Gitea**: m/paliad#152 (this design), m/paliad#151 (cronus U0-U4), m/paliad#149 (atlas Phase 2). +- **Coder phase** (deferred per inventor SKILL): runs after m ratifies §10 + §11. Slice ordering per §9. NOT atlas (parked at "TRACKER DESIGN READY FOR REVIEW"). Pattern-fluent Sonnet coder picks up T1 first. From c8f310c62c8b6675bea16ae74d62cb38871c748c Mon Sep 17 00:00:00 2001 From: mAi Date: Wed, 27 May 2026 21:13:35 +0200 Subject: [PATCH 3/3] =?UTF-8?q?design(procedures-tracker):=20fold=20m's=20?= =?UTF-8?q?7=20picks=20=E2=80=94=20=C2=A711=20decisions=20+=20=C2=A76.5=20?= =?UTF-8?q?multi-tl=20anchor=20+=20=C2=A79=20direct-replace=20migration=20?= =?UTF-8?q?(t-paliad-337)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 5 picks on-recommendation, 2 diverged: Q3 (multi-proceeding anchor scope): m picked 'other timelines auto-collapse to header-only' over the recommended 'stay expanded'. Added §6.5 with the header-card render rule. Q7 (migration cadence): m picked 'direct replace at T1, no flag' over the recommended flag-gated dev. §9 rewritten end-to-end: T1 ships the minimum-viable tracker visibly to users, replacing the catalog UI in the same PR. T2-T4 layer zoom + Akte + polish. T5 is cleanup-only. The 5 on-rec picks: inline checkbox forks (Q1), sibling-collapse zoom (Q2), 6 curated defaults on cold open (Q4), latest-done-deadline Akte anchor (Q5), global Stichtag (Q6) — all locked as drafted in §1-§8. Ready for review. Coder gate held; head decides T1 hire. --- ...-procedures-workflow-tracker-2026-05-27.md | 96 +++++++++++++++++-- 1 file changed, 86 insertions(+), 10 deletions(-) diff --git a/docs/design-procedures-workflow-tracker-2026-05-27.md b/docs/design-procedures-workflow-tracker-2026-05-27.md index 3bd1b33..864208e 100644 --- a/docs/design-procedures-workflow-tracker-2026-05-27.md +++ b/docs/design-procedures-workflow-tracker-2026-05-27.md @@ -328,6 +328,27 @@ This is what m means by "zoom into one event from within the timeline" — the * Zoom is page-scoped (one anchor per page, one zoom state). State in URL: `?event=&zoom=1`. +### §6.5 Multi-proceeding anchor scope (m's Q3 divergence) + +When the page shows >1 matched proceeding *and* an anchor is pinned, the non-anchored proceedings auto-collapse to a header-only one-line card: + +``` +┌─ upc.inf.cfi · Verletzungsverfahren UPC ─────┐ +│ … full timeline … │ +│ ━━ DU BIST HIER: Klageerwiderung ━━ │ +└──────────────────────────────────────────────┘ + +┌─ upc.rev.cfi ▸ ausblenden — [zeigen] ────────┐ +└──────────────────────────────────────────────┘ + +┌─ upc.apl.merits ▸ — [zeigen] ────────────────┐ +└──────────────────────────────────────────────┘ +``` + +Clicking a header card's `[zeigen]` link restores that proceeding's full timeline (the header stays as a per-card affordance for re-collapse). The collapsed state persists in `sessionStorage["procedures:collapsed_proceedings"]`. Un-pinning the anchor restores all visible proceedings to full-render automatically. + +The rule applies regardless of how the anchor was pinned (URL, search-auto, click-to-pin, Akte landing). The find-header result count still shows N proceedings matched — header cards are present, just collapsed. + ### §6.3 The "where I came from" question m's brief asked for backward-walk visualisation. Without zoom: the chain above the anchor is the backward walk — it's the same tree. With zoom: the breadcrumb at the top of the proceeding card is the backward walk in compact form. No separate concept; backward walk = upward in the tree. @@ -374,19 +395,51 @@ Empty filter result (e.g. user types nonsense): zero timelines render, with a he --- -## §9 Migration +## §9 Migration (direct replace per m's Q7) -5 slices, all surface, no DB mig. All independent of curie's editorial work — compound rules render inline via parent_id like any other rule; if curie ships a `compound_predecessors uuid[]` column later, those rules can render at multiple positions (one inline per predecessor) without tracker code changes beyond the join. +4 slices + 1 cleanup, all surface, no DB mig, no `?tracker=1` flag. Each slice ships visibly to users at `/tools/procedures`. T1 must be at least as functional as today's catalog browser — so the find header + multi-proceeding render + inline forks + aux inline all front-load there. T2-T4 layer the remaining behaviour. -| Slice | What ships | Reversible? | +All independent of curie's editorial work — compound rules render inline via parent_id like any other rule; if curie ships a `compound_predecessors uuid[]` column later, those rules can render at multiple positions (one inline per predecessor) without tracker code changes beyond the join. + +| Slice | What ships | Notes | |---|---|---| -| **T1 — Tracker page behind `?tracker=1`** | New `procedures-tracker.ts` mounts under a `?tracker=1` URL flag on `/tools/procedures`. Existing 4-tab UI stays default. | Yes — flag-gated | -| **T2 — Find header + multi-proceeding render** | Sticky header (search + pill rows + Akte + Stichtag) + render N matched proceedings as inline-forked trees (no aux expansion yet, no zoom). Forks: scenario flags + optionals. Default = Gewählt. | Yes — code-only | -| **T3 — Aux proceedings inline + appeal-target + court-set choices** | Spawn nodes expand inline (§5), appeal-target chip group on appeal root, `choices_offered` shapes wired. | Yes — code-only | -| **T4 — Anchor pin + zoom + Akte actuals overlay** | URL `?event=` pin, click-to-pin, `[Fokus]` chip per anchor, Akte deadlines join for status badges (§6.4). | Yes — code-only | -| **T5 — Hard-cut: tracker becomes the page** | `procedures.tsx` rewritten — tracker shell only. Legacy entry-tab logic in `procedures.ts` deleted. `/tools/procedures?mode=…` URL params 301-mapped to the new tracker URLs. Sidebar/cmd-K unchanged. | Reversible only by revert PR | +| **T1 — Tracker shell replaces the catalog page** | `/tools/procedures` now renders: sticky find header (search + Forum/Verfahren/Partei pills + Akte picker + global Stichtag), N-proceeding render (one card per matched proceeding), inline forks (scenario flags + optionals visible as checkboxes on the gating node), aux proceedings inline-expandable at spawn points, cold-open with 6 curated defaults (Q4), default = Gewählt. The 4 entry-mode tabs are deleted in the same PR; URL params `?mode=proceeding\|search\|wizard\|akte` 301-redirect or drop. URL anchor `?event=` scroll-highlights the matching node (no zoom yet). | Replaces catalog UI; users see the new tracker immediately. | +| **T2 — Anchor pin + zoom + multi-proceeding scope** | Anchor pin (lime band + DU BIST HIER divider), `[Fokus]` chip on anchored node toggles zoom (§6.2), URL state `?event=…&zoom=1`. Multi-proceeding auto-collapse rule (§6.5) kicks in when an anchor is set. Click-to-pin on any node. | Layered on T1's existing render. | +| **T3 — Akte landing + actuals overlay** | `?project=` derives anchor from latest `status='done'` deadline (Q5), backward walk overlays `paliad.deadlines` actuals as status badges (§6.4), scenario_flags load from project, fork write-back via existing `PATCH /api/projects/{id}/scenario-flags` + `POST /api/projects/{id}/deadlines/bulk`. | The first slice that exercises the project hookup end-to-end. | +| **T4 — Appeal-target + court-set choices + polish** | Wire `applies_to_target` array forks on appeal proceedings, `choices_offered` shapes (`appellant`, `include_ccr`, `skip`), court-set date override from `appointments` table, cross-party muted treatment per §3.6. Per-proceeding "Alle Optionen" toggle (§3.4). | Polish + the edge-case fork shapes. | +| **T5 — Cleanup** | Dead-code removal: legacy `procedures.ts` tab toggling, `fristenrechner-mode-a.ts` / `fristenrechner-wizard.ts` / `fristenrechner-result.ts` / `verfahrensablauf.ts` if no longer referenced (verify with grep before deletion). Sidebar/cmd-K unchanged (URL same). | No user-visible change. | -The flag-gated dev period (T1-T4) gives m + 2 PAs a chance to sanity-check before T5. m's cronus-Q11 precedent (hard cut, no dual-ship) applies — the audience is ~50 internal lawyers. +### §9.1 Constraint: T1 is the new floor + +Because there's no flag, **T1 must not regress** from today's catalog UI in any non-trivial way. The catalog today serves four user workflows: + +1. **Pick a proceeding, see its full Verfahrensablauf** → T1 covers via "Verfahren" pill click → that proceeding renders alone. +2. **Search for an event** → T1 covers via search input + auto-pin. +3. **Wizard from R1-R5** → T1 covers via Forum/Verfahren/Partei pills + search (the wizard's narrowing is just a sequence of filter applications). +4. **Enter via Akte** → T1 covers via the Akte picker; full actuals overlay arrives in T3 (open/done badges may render partial in T1, but the Akte's scenario_flags + proceeding pre-load works). + +If T1 reviewing exposes a regression, T1 holds (the issue blocks merge) — m's PR review gates the slice landing. + +### §9.2 What stays unchanged + +- URL: `/tools/procedures` keeps it. +- Sidebar entry "Verfahren & Fristen" keeps it. +- cmd-K palette keeps it. +- All other tools, calendar, projects, deadlines surfaces — untouched. +- Calculator (`pkg/litigationplanner.CalculateRule`) — untouched. + +### §9.3 Out-of-band dependencies + +- The compound-predecessors editorial column is owned by curie's t-paliad-333. Tracker reads whatever lands. If it slips past T4, compound rules render via their primary parent_id only (today's shape) — degraded but still correct on that path. No tracker re-render needed when curie ships. +- The Akte actuals overlay (T3) reads `paliad.deadlines.sequencing_rule_id` — column exists, nothing new. + +### §9.4 Test surface per slice + +- **T1**: cold-open 6 curated defaults render; search narrows to single proceeding; pill toggles change render; `?project=` loads Akte filters (no actuals yet); URL deep-link `?event=` highlights matching node; legacy `?mode=` redirects. +- **T2**: click-to-pin sets anchor with lime band; `[Fokus]` zoom collapses siblings; un-zoom restores; multi-proceeding auto-collapse when anchor active; URL state survives reload. +- **T3**: Akte landing auto-pins latest done deadline; status badges render on each node from `paliad.deadlines`; fork tick writes to `scenario_flags`; "In Akte speichern" persists. +- **T4**: appeal-target chips switch the rule set rendered on appeal proceedings; `choices_offered` per-node chip groups visible + functional; "Alle Optionen" reveals hidden conditional rules with greyed state. +- **T5**: production deploy unchanged surface; no live regression; deleted files don't break build. --- @@ -411,7 +464,30 @@ m's picks fold back into §11 below before the "TRACKER DESIGN READY FOR REVIEW" ## §11 m's decisions (2026-05-27) -To be populated after AskUserQuestion returns. Until then, the inventor picks above govern. +All 7 questions answered via `AskUserQuestion` in 2 batches (4 + 3) at 21:0?. 5 picks on-recommendation, 2 diverged. Decisions below; the underlying question list lives in §10 above as the historical record. + +### Tier 1 — fork UI + zoom + cross-party + +- **Q1 (Fork cluster on a node): Inline checkbox list below node header.** [= REC] **Locks §3.2.** Every fork on a given node renders as a checkbox in an "Optionen:" cluster line below the node header. Always visible, no hover, no extra click. Vertical real estate per node is acceptable because the default `Gewählt` mode keeps the tree compact (most events have zero forks). +- **Q2 (Zoom interaction): Collapse siblings to one-line summaries.** [= REC] **Locks §6.2.** `[Fokus]` chip on the anchored node folds sibling branches at each ancestor depth to a `… 4 weitere Schritte verborgen — [zeigen]` line. The anchored node's subtree renders full. Breadcrumb at the top of the proceeding card. Toggle off restores everything. +- **Q3 (Multi-proceeding anchor scope): Other timelines auto-collapse to header-only.** [≠ REC; m diverged from "stay expanded"] **Locks new §6.5.** When an anchor is pinned on a multi-proceeding page, the non-anchored proceedings fold to a one-line header card (`upc.rev.cfi ▸ ausblenden — [zeigen]`). Clicking the header line restores that proceeding's full timeline. Rationale (interpreted): with an anchor pinned, the page is *about* that anchor — having other proceedings full-render in parallel competes for attention without earning it. The header card preserves the find-header result count and offers a one-click escape if the user wants to compare. +- **Q4 (Cold open content): 6 curated default proceedings.** [= REC] **Locks §8.** No URL params + no Akte → render `upc.inf.cfi`, `upc.rev.cfi`, `upc.apl.merits`, `de.inf.lg`, `epa.opp.opd`, `dpma.opp.dpma` stacked vertically, all forks off, no anchor. Hint: "Suche oder filtere, um andere Verfahren zu sehen." + +### Tier 2 — Akte + Stichtag + migration + +- **Q5 (Akte default anchor): Latest `status='done'` deadline.** [= REC] **Locks §6.4 + §9.** `?project=` → derive anchor by `SELECT … FROM paliad.deadlines WHERE project_id=$p AND sequencing_rule_id IS NOT NULL ORDER BY completed_at DESC NULLS LAST LIMIT 1`. Fallback: next open deadline → proceeding root. The backward chain reads as Akte history; the anchor itself is the most recently completed work; forward is upcoming. +- **Q6 (Stichtag scope): Global, feeds all visible proceedings.** [= REC] **Locks §2.1 + §7.** One date input in the find header. All visible proceedings compute dates against it. When the user has an Akte loaded, the Stichtag pre-fills from the project's latest trigger date but is overrideable. When the anchor is pinned to a `status='done'` deadline, the date input shows that deadline's `completed_at` but can still be overridden for "what-if" exploration. +- **Q7 (Migration cadence): Direct replace at T1 — no flag.** [≠ REC; m diverged from flag-gated dev] **Rewrites §9.** Every slice ships visibly to users at /tools/procedures. T1 must be at minimum equivalent to today's catalog browser (so the slicing has to front-load find header + multi-proceeding render + forks inline + aux inline). The flag-gated dev plan is dropped. cronus's Q11 hard-cut precedent extends here: m would rather ship per-slice visibly than carry a parallel surface during dev. Rationale (interpreted): partial-tracker > no-tracker, and ~50 internal lawyers absorb the per-slice deltas through release comms. + +### §11.1 Changes triggered by m's divergences + +**Q3 divergence — multi-proceeding anchor scope.** New §6.5 added below. The header-card-only render for non-anchored proceedings preserves filter compose (you can still see "upc.rev.cfi matched the filter") while clearing the page's vertical real estate for the anchor's full context. + +**Q7 divergence — direct replace.** §9 rewritten end-to-end. T1 now ships the minimum-viable tracker (find header + multi-proceeding render + forks inline + aux subtrees inline + URL-anchor highlight), replacing the catalog UI at /tools/procedures from the moment it merges. T2-T4 layer zoom, Akte semantics, polish. T5 ("cleanup only") is now just dead-code removal. + +### §11.2 What stays unchanged + +The other 5 picks (Q1, Q2, Q4, Q5, Q6) ratified the inventor proposal. Inline checkbox forks per node, breadcrumb-collapse zoom, 6-curated cold open, latest-done-deadline Akte anchor, global Stichtag — all locked as drafted in §1-§8. ---