SmartTimeline — 7-event lookahead + dependency display + enforced sequence (Slice 2 extension) #31
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Source: m @ 2026-05-09 12:02 verbatim:
Three layered requirements
1. 7-event lookahead window
The Verlauf tab on
/projects/<id>(Case-level only — see §5 of the design doc for higher-level aggregation) renders a forward-looking section showing the next ~7 likely upcoming events. "Likely" here = the projected rows fromFristenrechnerService.CalculateafterAnchorOverridesare applied (i.e. predictions conditioned on actuals already entered).Not 7 fixed-rule predictions — 7 active upcoming events: skip rules that don't apply because their
condition_flagis unsatisfied or because the proceeding has progressed past them. Numerically tunable; 7 is the default lookahead, not a hard cap. "Mehr anzeigen" expands the list.This is a UX layer over Slice 2's projection output — Slice 2 already needs
FristenrechnerService.Calculateintegration; the 7-cap is a render-side filter.2. Dependency display
Each projected (and actual) row should surface its provenance — which prior event it depends on for its date math. The data already exists: every
paliad.deadline_rulesrow has a parent rule it triggers from (the rule chain is what lagrange's design §6 calls the "AnchorOverrides reflow chain"). What's missing is the UI affordance.Proposed surface (open for refinement):
"folgt aus: <parent rule code/name> (<actual date | predicted date | datum offen>)".This is purely additive to lagrange's design; no schema change.
3. Enforced sequences ("can't have SoD before SoC")
The SoC→SoD pair is the canonical example. UPC RoP R.23 (Statement of Defence) is triggered by service of the Statement of Claim — without an SoC date, an SoD due-date prediction is meaningless. Two enforcement levels possible:
"voraussichtlich — abhängig von SoC (Datum offen)", dated cell empty, predicted-faded styling.POST /api/projects/{id}/timeline/anchor), reject{rule_code: 'sod', actual_date: ...}if the parent rule (soc) has no anchored actual yet. Return a 409 with a suggested-fix message ("SoC zuerst eintragen").Design call: probably both — soft default in the projection (Slice 2), hard block on write (Slice 2 anchor endpoint). Capture the parent-rule expectation as a structural property of
deadline_rules, not a code-side switch — the rule data already has the dependency edge; the API just needs to read it before allowing a write.Open question: are there cases where a successor's actual date legitimately precedes the predecessor's? E.g. a counterclaim filed before the main claim's response — but that's a different proceeding (CCR sub-project per §4) so its rule chain is independent. Inside a single proceeding's rule tree, sequence violations should always be errors. Confirm.
Mapping to the existing design
This extends Slice 2 of
docs/design-smart-timeline-2026-05-08.md(lagrange, merged @487fec2). Slice 2 already includes:FristenrechnerService.Calculateintegration → projected rows in the timelineappointments.deadline_rule_idFKpaliad.deadlines.source = 'anchor'This issue layers three additions on top:
None of these requires a Slice 2 redesign — they're additive. Slice 2's coder shift can absorb them, OR they can split into a Slice 2.5 if the original Slice 2 is already in flight when this lands. Tag whichever path m picks at greenlight time.
Open questions
soft_warning: trueand a UI confirm modal? Reject is cleaner; confirm-and-write lets the user override when the rule doesn't match reality (e.g. a procedural quirk we haven't modelled).Out of scope
Filed overnight per m's autonomy directive @ 2026-05-08 23:09. Review at m's pace; this is captured for Slice 2 planning.
SmartTimeline Slice 2 + the layered #31 features shipped on branch mai/gauss/smarttimeline-slice-2.
Commits:
85d7dd4feat(t-paliad-173): SmartTimeline Slice 2 backend — projection + anchor + skip + sequence guard331efc8feat(t-paliad-173): SmartTimeline Slice 2 frontend + #31 layered features#31 layer-by-layer:
, <Date|Datum offen>)" footer on every row with a deadline_rule_id whose rule has a parent. "[Pfad anzeigen]" expander.Migration 076 was applied live (tracker 75 → 76); deploy re-applies idempotently.
m/maria — ready for review.
SmartTimeline Slice 4 — SHIPPED on
mai/schroedinger/smarttimeline-slice-4This closes the 4-slice phasing of t-paliad-169 (design
docs/design-smart-timeline-2026-05-08.md).Commits:
7da8802backend —levelPolicy(projectType)+ lane aggregation +metadata.bubble_uphonoured + envelope wire shape{events, lanes}7e57507frontend — lane-grouped render inshape-timeline.ts, lane filter chip, Client-levelTimeline-Ansichttoggle, custom-milestone bubble-up checkbox, CSS + i18nLayered features (per §5.1):
Timeline-Ansichttoggle (state persists per project in localStorage)Bubble-up (Q5 lock-in):
metadata.bubble_up=trueoverrides the level policy filter at Patent/Litigation/Client.counterclaim_created(Slice 3 path) now setsbubble_up=trueon both parent and child audit rows.third_party_interventionandscope_changedefault-on by event_type (no current write path; ready for future routes).custom_milestonedefault-off; user opts in via the form checkbox.Wire shape changed:
GET /api/projects/{id}/timelinereturns{events, lanes}envelope (was[]TimelineEvent). Frontend has a defensive fallback for the rolling deploy window.X-Projection-Total / Lookahead / Tracksheaders preserved for Slice 1-3 affordances.Tests:
TestLevelPolicy(locks the (kinds, statuses, lane_axis) triple per type),TestRowSurvivesPolicy_BubbleUpOverridesFilter(override contract),TestExtractBubbleUp(12 cases covering per-event-type defaults + explicit overrides + malformed metadata),TestChildTypeForAxisTestProjectionService_LevelAggregation_Livewalks a Patent → Case-A + Case-B fixture, asserts bubbled-up milestone surfaces under Case-As lane, regular custom_milestone is filtered, deadlines surface at Patent levelBuild hygiene:
go build/go vet/go testclean (caches reused).bun run buildclean — i18n codegen 2171 keys.Branch ready for review + merge. Awaiting marias gate.