Extend /tools/procedures: where-am-I + what's-next workflow tracker on top of the unified catalog (m/paliad#151 follow-up) #152

Open
opened 2026-05-27 18:48:01 +00:00 by mAi · 3 comments
Collaborator

m's reframe (2026-05-27 20:43)

I do want to 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.

The unified tool we shipped today (m/paliad#151 U0-U4) is a catalog browser — it ports the original Fristenrechner + Verfahrensablauf into one URL but doesn't anchor the user in a sequence position. m wants a workflow tracker: pick (or arrive at) any procedural event, see where you came from, where you are, what's next, with constellation variants (scenario_flags) explorable.

What's broken in the current /tools/procedures

m's surfaced UX bugs from the live page:

  1. 4 tabs visible at once — pre-form for one tab leaks into others. m chose 'all tabs visible' in cronus's Q11 but the rendered result is incoherent.
  2. Result view fires too many rules — including conditional rules whose flags aren't set + compound-name rules — wall of events instead of focused sequence.
  3. Proaktiv/Gericht/Reaktiv columns don't carry workflow weight — they're a stance grouping, not a sequence anchor.
  4. No 'you are here' indicator — the user can't tell which event is the current position.
  5. Sequence isn't visualised as a sequence — flat list rather than chained-from-X view.

What the workflow tracker must answer

For any given procedural event picked (or arrived-at from an Akte):

  • Where I came from: the chain backward (parent_id walk) showing the events that led here.
  • Where I am: this event, highlighted with its rule, deadline, party stance.
  • What's next: forward-walk via children — immediate next + downstream chain.
  • Under which constellation: with the current scenario_flags shown as togglable predicates so the user can see how branches diverge.
  • Alternative constellations: a 'show me what would have happened with with_ccr=true' branch viewer.

Acceptance for the inventor pass

Deliverable: docs/design-procedures-workflow-tracker-2026-05-NN.md covering:

  1. Tab UX redo — pick one: mutually exclusive tabs / single-pane wizard / drawer-overlay. cronus's 'all tabs visible' demonstrably failed; pick the lower-friction shape.
  2. 'You are here' anchor — how the trigger event is visually pinned. Sticky header? Vertical waterfall with the anchor at the centre line? Breadcrumb?
  3. Backward walk — render N hops of predecessors (default: 2-3). When entry is from an Akte (project Verlauf), backward = actual completed deadlines + remaining anchors.
  4. Forward walk — render full successor tree, scenario-flag-gated. Conditional rules hidden by default unless their flag is set OR the user explicitly opts in.
  5. Constellation viewer — 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.
  6. Compound rules — the 7 curie-flagged + future ones. Hide by default, surface in a 'cross-cutting' drawer with explicit join-multiple-events annotation.
  7. Three views of the same data (per m's 'alternative means to derive at what you want'):
    • Anchor view — single event centred, backward+forward chain
    • Proceeding view — entire proceeding's chain as a tree (today's Verfahrensablauf shape, but with 'you are here' marker)
    • Constellation view — multi-branch view of all scenario combinations (mostly for browsing)
  8. Akte entry — when user arrives from /projects/{id}, derive anchor from the project's latest completed deadline (or selectable). Wire through P0 SSoT.
  9. Migration plan — extend or replace the current /tools/procedures. Keep behind a flag during dev, hard-cut once ratified.

Use AskUserQuestion in 4-Q batches. Park after 'TRACKER DESIGN READY FOR REVIEW'.

Sources to read

  • docs/design-unified-procedural-events-tool-2026-05-27.md — cronus's existing design
  • frontend/src/client/procedures.ts + frontend/src/procedures.tsx + frontend/src/components/VerfahrensablaufBody.tsx — live /tools/procedures code
  • docs/design-deadline-system-revision-2026-05-27.md §3.3 — Entry A tree spec
  • docs/design-fristenrechner-overhaul-2026-05-26.md — Mode A+B design
  • Phase 2 P0 (scenario_flags SSoT) already shipped

Out of scope

  • Calculator changes
  • Editorial backfill (curie just finished, 7 compound rules still flagged for m's split-review)
  • /admin/procedural-events (editorial write surface, separate)
  • /projects/{id} Verlauf (Akte-actuals surface, separate)
  • youpc.org/deadlines (cross-repo)
## m's reframe (2026-05-27 20:43) > I do want to 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. The unified tool we shipped today (m/paliad#151 U0-U4) is a *catalog browser* — it ports the original Fristenrechner + Verfahrensablauf into one URL but doesn't anchor the user in a sequence position. m wants a **workflow tracker**: pick (or arrive at) any procedural event, see where you came from, where you are, what's next, with constellation variants (scenario_flags) explorable. ## What's broken in the current /tools/procedures m's surfaced UX bugs from the live page: 1. **4 tabs visible at once** — pre-form for one tab leaks into others. m chose 'all tabs visible' in cronus's Q11 but the rendered result is incoherent. 2. **Result view fires too many rules** — including conditional rules whose flags aren't set + compound-name rules — wall of events instead of focused sequence. 3. **Proaktiv/Gericht/Reaktiv columns** don't carry workflow weight — they're a stance grouping, not a sequence anchor. 4. **No 'you are here' indicator** — the user can't tell which event is the *current* position. 5. **Sequence isn't visualised as a sequence** — flat list rather than chained-from-X view. ## What the workflow tracker must answer For *any given procedural event* picked (or arrived-at from an Akte): - **Where I came from**: the chain backward (parent_id walk) showing the events that led here. - **Where I am**: this event, highlighted with its rule, deadline, party stance. - **What's next**: forward-walk via children — immediate next + downstream chain. - **Under which constellation**: with the current scenario_flags shown as togglable predicates so the user can see how branches diverge. - **Alternative constellations**: a 'show me what would have happened with with_ccr=true' branch viewer. ## Acceptance for the inventor pass Deliverable: `docs/design-procedures-workflow-tracker-2026-05-NN.md` covering: 1. **Tab UX redo** — pick one: mutually exclusive tabs / single-pane wizard / drawer-overlay. cronus's 'all tabs visible' demonstrably failed; pick the lower-friction shape. 2. **'You are here' anchor** — how the trigger event is visually pinned. Sticky header? Vertical waterfall with the anchor at the centre line? Breadcrumb? 3. **Backward walk** — render N hops of predecessors (default: 2-3). When entry is from an Akte (project Verlauf), backward = actual completed deadlines + remaining anchors. 4. **Forward walk** — render full successor tree, scenario-flag-gated. Conditional rules hidden by default unless their flag is set OR the user explicitly opts in. 5. **Constellation viewer** — 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. 6. **Compound rules** — the 7 curie-flagged + future ones. Hide by default, surface in a 'cross-cutting' drawer with explicit join-multiple-events annotation. 7. **Three views of the same data** (per m's 'alternative means to derive at what you want'): - **Anchor view** — single event centred, backward+forward chain - **Proceeding view** — entire proceeding's chain as a tree (today's Verfahrensablauf shape, but with 'you are here' marker) - **Constellation view** — multi-branch view of all scenario combinations (mostly for browsing) 8. **Akte entry** — when user arrives from /projects/{id}, derive anchor from the project's latest completed deadline (or selectable). Wire through P0 SSoT. 9. **Migration plan** — extend or replace the current /tools/procedures. Keep behind a flag during dev, hard-cut once ratified. Use AskUserQuestion in 4-Q batches. Park after 'TRACKER DESIGN READY FOR REVIEW'. ## Sources to read - `docs/design-unified-procedural-events-tool-2026-05-27.md` — cronus's existing design - `frontend/src/client/procedures.ts` + `frontend/src/procedures.tsx` + `frontend/src/components/VerfahrensablaufBody.tsx` — live /tools/procedures code - `docs/design-deadline-system-revision-2026-05-27.md` §3.3 — Entry A tree spec - `docs/design-fristenrechner-overhaul-2026-05-26.md` — Mode A+B design - Phase 2 P0 (scenario_flags SSoT) already shipped ## Out of scope - Calculator changes - Editorial backfill (curie just finished, 7 compound rules still flagged for m's split-review) - /admin/procedural-events (editorial write surface, separate) - /projects/{id} Verlauf (Akte-actuals surface, separate) - youpc.org/deadlines (cross-repo)
mAi self-assigned this 2026-05-27 18:48:01 +00:00
Author
Collaborator

T1-T4 + cleanup train shipped on mai/knuth/coder-workflow-tracker (t-paliad-338).

Commits

  • T1 — workflow-tracker shell replaces catalog: bfb38aa
  • T2 — anchor pin + zoom + multi-proceeding scope (§6.1–§6.5): 7945bfb
  • T3 — Akte landing + actuals overlay + scenario-flag write-back (§6.4 / Q5): 1ed75c5
  • T4 — appeal-target + Alle Optionen + cross-party + cross-surface flag listener (§3.4 / §3.6): c80723f
  • T5 — cleanup: 10 dead-code files removed (catalog Mode A/B/result + verfahrensablauf modules): 73f49c4

Build hygiene

All five slices: bun build clean, bun test clean (217 pass after T5's test-file deletions), go vet ./... clean. T5 trimmed 10 files and ~4480 LoC; the new workflow-tracker (procedures.ts + procedures-tracker.ts + tracker CSS) totals ~1100 LoC of replacement scope.

What ships at /tools/procedures

Single canonical shape per design §1:

  1. Sticky find header — search input (debounced 200ms → /api/tools/fristenrechner/search?kind=events), forum / Verfahren / Partei pills, global Stichtag. Result-count + Akte chip + Anker chip in a live-region summary line.
  2. Per-proceeding cards — chained tree by parent_id with priority-styled bullets (solid mandatory, muted recommended, dotted optional, faded informational, blue court-set). Party badge (K/B/G/K+B). Per-card Optionen strip carries the applicable scenario-flag forks (with_ccr, with_amend, with_cci). Per-card Detailgrad-toggle (Gewählt ↔ Alle Optionen). Per-card collapse/expand affordance.
  3. Anchor pin (📌) on every node with a real rule_id — toggles ?event=. ── DU BIST HIER ── divider beneath the anchored line.
  4. Fokus chip (🔍) on the anchored node — toggles ?zoom=1. Renders the ancestor chain as a breadcrumb at the top of the proceeding card and folds siblings into a hidden-count footer.
  5. Multi-proceeding scope (§6.5) — when anchor pinned + >1 proceeding visible, non-anchored proceedings collapse to header-only one-line cards with [zeigen] / [ausblenden] toggles. Pinning a different node resets the user's expansion set.
  6. Akte (?project=) — fetches project + timeline + scenario_flags; overlays per-rule actuals badges (✓/⚠/📅/◇); auto-pins anchor to the latest done deadline; PATCHes scenario-flags on every fork toggle. Cross-surface scenario-flag-changed listener re-syncs without a refresh.
  7. Appeal-target chips — on upc.apl.unified. Picks the rule subset matching applies_to_target (Endentscheidung / Kostenentscheidung / Anordnung / Schadensbemessung / Bucheinsicht).
  8. Cross-party muted treatment (§3.6) — when Partei pill is set, opposing-side rows render with a "Gegen." badge and faded text.

Cold-open (no URL params, no Akte)

The 6 curated defaults from §8 / Q4 render stacked:
upc.inf.cfi, upc.rev.cfi, upc.apl.unified, de.inf.lg, epa.opp.opd, dpma.opp.dpma. A hint card above invites the user to filter for other proceedings.

Out-of-scope (deferred)

  • Per-node inline forks — design §3.2 specifies fork checkboxes on the gating node itself. T1-T4 ship per-card placement at the top of each proceeding (which scopes the fork to the proceeding and avoids the page-level strip m's bug #5 flagged). A future shift can refine to per-node by parsing condition_expr ↔ parentRuleCode mapping.
  • Aux proceedings inline-expandable — design §5. TimelineEntry doesn't currently carry isSpawn / spawnProceedingCode through the calc response (the engine consumes them server-side for sub-track routing). A future backend pass would surface those fields so the tracker can render inline spawn subtrees.
  • Court-set choices_offered chip group — the calc response carries the field but the tracker doesn't yet paint a chip route for it (T4 polish slip).
  • CSS housekeeping — the legacy .fristen-wizard-, .verfahrensablauf- selectors stay in global.css. They're orphans (no DOM match) but a sweep wasn't load-bearing for this train.

Ready for m's merge gate.

T1-T4 + cleanup train shipped on `mai/knuth/coder-workflow-tracker` (t-paliad-338). ## Commits - T1 — workflow-tracker shell replaces catalog: [bfb38aa](https://mgit.msbls.de/m/paliad/commit/bfb38aa) - T2 — anchor pin + zoom + multi-proceeding scope (§6.1–§6.5): [7945bfb](https://mgit.msbls.de/m/paliad/commit/7945bfb) - T3 — Akte landing + actuals overlay + scenario-flag write-back (§6.4 / Q5): [1ed75c5](https://mgit.msbls.de/m/paliad/commit/1ed75c5) - T4 — appeal-target + Alle Optionen + cross-party + cross-surface flag listener (§3.4 / §3.6): [c80723f](https://mgit.msbls.de/m/paliad/commit/c80723f) - T5 — cleanup: 10 dead-code files removed (catalog Mode A/B/result + verfahrensablauf modules): [73f49c4](https://mgit.msbls.de/m/paliad/commit/73f49c4) ## Build hygiene All five slices: `bun build` clean, `bun test` clean (217 pass after T5's test-file deletions), `go vet ./...` clean. T5 trimmed 10 files and ~4480 LoC; the new workflow-tracker (procedures.ts + procedures-tracker.ts + tracker CSS) totals ~1100 LoC of replacement scope. ## What ships at /tools/procedures Single canonical shape per design §1: 1. **Sticky find header** — search input (debounced 200ms → /api/tools/fristenrechner/search?kind=events), forum / Verfahren / Partei pills, global Stichtag. Result-count + Akte chip + Anker chip in a live-region summary line. 2. **Per-proceeding cards** — chained tree by parent_id with priority-styled bullets (solid mandatory, muted recommended, dotted optional, faded informational, blue court-set). Party badge (K/B/G/K+B). Per-card Optionen strip carries the applicable scenario-flag forks (with_ccr, with_amend, with_cci). Per-card Detailgrad-toggle (Gewählt ↔ Alle Optionen). Per-card collapse/expand affordance. 3. **Anchor pin (📌)** on every node with a real rule_id — toggles `?event=`. `── DU BIST HIER ──` divider beneath the anchored line. 4. **Fokus chip (🔍)** on the anchored node — toggles `?zoom=1`. Renders the ancestor chain as a breadcrumb at the top of the proceeding card and folds siblings into a hidden-count footer. 5. **Multi-proceeding scope (§6.5)** — when anchor pinned + >1 proceeding visible, non-anchored proceedings collapse to header-only one-line cards with [zeigen] / [ausblenden] toggles. Pinning a different node resets the user's expansion set. 6. **Akte (?project=)** — fetches project + timeline + scenario_flags; overlays per-rule actuals badges (✓/⚠/📅/◇); auto-pins anchor to the latest done deadline; PATCHes scenario-flags on every fork toggle. Cross-surface scenario-flag-changed listener re-syncs without a refresh. 7. **Appeal-target chips** — on upc.apl.unified. Picks the rule subset matching applies_to_target (Endentscheidung / Kostenentscheidung / Anordnung / Schadensbemessung / Bucheinsicht). 8. **Cross-party muted treatment (§3.6)** — when Partei pill is set, opposing-side rows render with a "Gegen." badge and faded text. ## Cold-open (no URL params, no Akte) The 6 curated defaults from §8 / Q4 render stacked: `upc.inf.cfi`, `upc.rev.cfi`, `upc.apl.unified`, `de.inf.lg`, `epa.opp.opd`, `dpma.opp.dpma`. A hint card above invites the user to filter for other proceedings. ## Out-of-scope (deferred) - **Per-node inline forks** — design §3.2 specifies fork checkboxes on the gating node itself. T1-T4 ship per-card placement at the top of each proceeding (which scopes the fork to the proceeding and avoids the page-level strip m's bug #5 flagged). A future shift can refine to per-node by parsing condition_expr ↔ parentRuleCode mapping. - **Aux proceedings inline-expandable** — design §5. TimelineEntry doesn't currently carry isSpawn / spawnProceedingCode through the calc response (the engine consumes them server-side for sub-track routing). A future backend pass would surface those fields so the tracker can render inline spawn subtrees. - **Court-set choices_offered** chip group — the calc response carries the field but the tracker doesn't yet paint a chip route for it (T4 polish slip). - **CSS housekeeping** — the legacy .fristen-wizard-*, .verfahrensablauf-* selectors stay in global.css. They're orphans (no DOM match) but a sweep wasn't load-bearing for this train. Ready for m's merge gate.
Author
Collaborator

Workflow-tracker T1–T5 train merged. main now at 6506d7d.

Slice commits (on mai/knuth/coder-workflow-tracker)

Slice Commit Scope
T1 bfb38aa workflow-tracker shell replaces catalog UI
T2 7945bfb anchor pin + zoom + multi-proceeding scope (§6.5)
T3 1ed75c5 Akte landing + actuals overlay + scenario-flag write-back
T4 c80723f appeal-target + Alle Optionen + cross-party + polish
T5 73f49c4 cleanup — 10 dead-code files removed (Mode A/B/result + verfahrensablauf)

Merge commits on main

  • 2e6427d — T1+T2 (T2 landed on branch ~10s before head ran the merge; folded in together)
  • 6506d7d — T3+T4+T5

Post-merge: bun run build + go vet ./... clean.

Live UX data fixes shipped alongside (14 rows, audit_reason set per cluster)

During m's review of T1, two data-quality bugs surfaced. Pure data fix, no code change:

  • primary_party set on 9 rules previously NULL (rendering as "Gericht"): RoP.029/032.3 Replik+Duplik chains (claimant/defendant per direction), RoP.056.1/.3 (Erwiderung-VWK = claimant, Replik = defendant), RoP.007.4 / R.118.4 / R.320 → both.
  • primary_party='both' stopgap on 3 compound null.* events still on curie's split-review backlog (02ae9c1f, cec1a865, ec2a1274).
  • trigger_event_id=49 (oral_hearing) on translation_request R.109(1) + interpreter_cost R.109(4) — fixed the "Antrag auf Simultanübersetzung shown at wrong early position" bug (calculator was falling back to case-start with NULL anchor).
  • Renamed upc.inf.cfi.translation_request to "Antrag auf Übersetzung in andere Sprache (R.109(1))" to disambiguate from R.109(5) interpreter_request.

Follow-ups (from knuth's debrief — separate tasks if you want them)

  • Per-node inline forks (design §3.2 purity vs T1's card-level transitional shape)
  • Aux-proceedings inline-expandable — needs backend to surface isSpawn/spawnProceedingCode on TimelineEntry
  • Court-set choices_offered chip group on tracker nodes
  • CSS housekeeping for legacy .fristen-wizard-* / .verfahrensablauf-* selectors orphaned by T5

Leaving issue open per protocol — m closes when satisfied.

**Workflow-tracker T1–T5 train merged.** main now at `6506d7d`. ## Slice commits (on `mai/knuth/coder-workflow-tracker`) | Slice | Commit | Scope | |---|---|---| | T1 | [`bfb38aa`](https://mgit.msbls.de/m/paliad/commit/bfb38aa) | workflow-tracker shell replaces catalog UI | | T2 | [`7945bfb`](https://mgit.msbls.de/m/paliad/commit/7945bfb) | anchor pin + zoom + multi-proceeding scope (§6.5) | | T3 | [`1ed75c5`](https://mgit.msbls.de/m/paliad/commit/1ed75c5) | Akte landing + actuals overlay + scenario-flag write-back | | T4 | [`c80723f`](https://mgit.msbls.de/m/paliad/commit/c80723f) | appeal-target + Alle Optionen + cross-party + polish | | T5 | [`73f49c4`](https://mgit.msbls.de/m/paliad/commit/73f49c4) | cleanup — 10 dead-code files removed (Mode A/B/result + verfahrensablauf) | ## Merge commits on main - [`2e6427d`](https://mgit.msbls.de/m/paliad/commit/2e6427d) — T1+T2 (T2 landed on branch ~10s before head ran the merge; folded in together) - [`6506d7d`](https://mgit.msbls.de/m/paliad/commit/6506d7d) — T3+T4+T5 Post-merge: `bun run build` + `go vet ./...` clean. ## Live UX data fixes shipped alongside (14 rows, audit_reason set per cluster) During m's review of T1, two data-quality bugs surfaced. Pure data fix, no code change: - **`primary_party` set on 9 rules** previously NULL (rendering as "Gericht"): RoP.029/032.3 Replik+Duplik chains (claimant/defendant per direction), RoP.056.1/.3 (Erwiderung-VWK = claimant, Replik = defendant), RoP.007.4 / R.118.4 / R.320 → `both`. - **`primary_party='both'` stopgap on 3 compound `null.*` events** still on curie's split-review backlog (`02ae9c1f`, `cec1a865`, `ec2a1274`). - **`trigger_event_id=49` (oral_hearing)** on `translation_request` R.109(1) + `interpreter_cost` R.109(4) — fixed the "Antrag auf Simultanübersetzung shown at wrong early position" bug (calculator was falling back to case-start with NULL anchor). - **Renamed `upc.inf.cfi.translation_request`** to "Antrag auf Übersetzung in andere Sprache (R.109(1))" to disambiguate from R.109(5) `interpreter_request`. ## Follow-ups (from knuth's debrief — separate tasks if you want them) - Per-node inline forks (design §3.2 purity vs T1's card-level transitional shape) - Aux-proceedings inline-expandable — needs backend to surface `isSpawn`/`spawnProceedingCode` on `TimelineEntry` - Court-set `choices_offered` chip group on tracker nodes - CSS housekeeping for legacy `.fristen-wizard-*` / `.verfahrensablauf-*` selectors orphaned by T5 Leaving issue open per protocol — m closes when satisfied.
mAi added the
done
label 2026-05-27 20:01:19 +00:00
Author
Collaborator

Tracker reverted on main per m's 2026-05-27 22:08 direction — anchor + scope shape didn't land. main now at ed3c5d1 (three revert commits: 5869251, be570c2, ed3c5d1). /tools/procedures is back to the U0-U4 catalog + Mode A + wizard + verfahrensablauf shape. Build + vet clean.

Next: m drives a fresh PRD for a columnar + modular proceeding overview. Issue stays open until that lands.

Tracker reverted on main per m's 2026-05-27 22:08 direction — anchor + scope shape didn't land. main now at `ed3c5d1` (three revert commits: `5869251`, `be570c2`, `ed3c5d1`). `/tools/procedures` is back to the U0-U4 catalog + Mode A + wizard + verfahrensablauf shape. Build + vet clean. Next: m drives a fresh PRD for a columnar + modular proceeding overview. Issue stays open until that lands.
mAi removed the
done
label 2026-05-27 20:09:43 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: m/paliad#152
No description provided.