- internal/services/mail_service.go: SMTP/TLS sender (implicit TLS on 465), html/template rendering, branded base layout + content templates, silent no-op when SMTP_* unset. - internal/services/reminder_service.go: hourly scanner for Fristen that are overdue / due tomorrow / due within the week (Monday digest). Dedup via paliad.reminder_log (24h window). - internal/services/invite_service.go: POST /api/invite flow with domain whitelist, in-memory 10/day/user rate limit, audit row in paliad.invitations. - internal/handlers/invite.go: POST + GET /api/invite handlers. - Sidebar "Kolleg:in einladen" button + modal on every page. - migration 016: paliad.reminder_log, paliad.invitations, users.lang column. - docker-compose: SMTP_* + PALIAD_BASE_URL env vars. - docs/feature-roadmap.md: documented Supabase auth-SMTP routing as open question; current pilot keeps identity mails on Supabase default sender. Rationale: get Paliad off Supabase's best-effort outbound for the inbox-facing stuff (reminders, invitations) and move deadline nudges from passive dashboard to active email. Custom Supabase auth SMTP is blocked on the shared ydb.youpc.org instance — deferred until Paliad has its own project or GoTrue webhook relay.
303 lines
19 KiB
Markdown
303 lines
19 KiB
Markdown
# Paliad Feature Roadmap
|
||
|
||
**Author:** cronus (inventor) | **Original date:** 2026-04-14 | **Rewritten:** 2026-04-17 (Phase J, after KanzlAI integration)
|
||
**Task:** t-paliad-013 (rewrite); originally t-patholo-011
|
||
|
||
---
|
||
|
||
## Strategic Position
|
||
|
||
Paliad is the **all-in-one platform for HLC patent practice**: knowledge tools plus Aktenverwaltung, behind one sidebar, one URL, one login.
|
||
|
||
It grew out of a pure knowledge platform (patholo.de, Q1 2026) and absorbed the KanzlAI case-management prototype on 2026-04-16 after the HL → HLC merger. The goal stays the same: every new associate's first bookmark, every partner's quick-reference, every PA's template source — and now also the place where a lawyer checks their next Frist before looking up the relevant UPC fee.
|
||
|
||
### Audience
|
||
|
||
- Patent lawyers and PAs across 7 offices (Munich, Düsseldorf, Hamburg, Amsterdam, London, Paris, Milan)
|
||
- Mix of German and English speakers — DE/EN toggle on every page
|
||
- Range from senior partners to new associates
|
||
- Daily work: drafting submissions, calculating costs, tracking deadlines, managing matters, researching case law
|
||
|
||
### What We Have (shipped — April 2026)
|
||
|
||
| Feature | Phase | Status |
|
||
|---|---|---|
|
||
| Supabase auth (@hoganlovells.com gate) | v1 | Live |
|
||
| Prozesskostenrechner (DE / UPC / EPA) | v1 | Live |
|
||
| Fristenrechner (deadlines with holiday adjustment) | v1 | Live |
|
||
| Lime-green branding + DE/EN i18n + sidebar | v1 | Live |
|
||
| File proxy + Downloads page (HL Patents Style.dotm) | 1.2 | Live |
|
||
| Link Hub with curated categories + youpc.org case-law link | 1.1 / 2.3 | Live |
|
||
| Gebührentabellen (GKG / RVG / UPC / EPA / PatKostG) | 1.3 | Live |
|
||
| Patentglossar (DE/EN, searchable) | 1.4 | Live |
|
||
| Kostenrechner enhancements (PDF export, URL sharing, scenario comparison) | 1.5 | Live (partial — Prozesskostensicherheit pending) |
|
||
| Gerichtsverzeichnis (court directory) | 2.2 | Live |
|
||
| Checklisten (interactive filing checklists) | 2.4 | Live |
|
||
| **Akten** (matter management, office-scoped visibility, collaborators) | 0.1 (A–D) | Live |
|
||
| **Fristen** (persistent deadline management, traffic-light cards, calendar) | 0.2 (E) | Live |
|
||
| **Termine** (appointments, calendar view) + **CalDAV sync** (AES-GCM at rest) | 0.3 (F) | Live |
|
||
| **Dashboard** (logged-in landing, server-rendered) | 0.4 (G) | Live |
|
||
|
||
### Design Principles
|
||
|
||
1. **Knowledge and practice live together** — tools and content bring people in; Aktenverwaltung keeps them there daily.
|
||
2. **Office-scoped by default** — an Akte belongs to one office; cross-office access is explicit via collaborator lists or a partner-toggled firm-wide flag. No "everyone sees everything" and no multi-tenancy machinery. See `docs/design-kanzlai-integration.md` §2.
|
||
3. **Self-serve over manual curation** — prefer structured data + search over hand-maintained pages.
|
||
4. **Ship incrementally** — each feature is independently useful.
|
||
5. **German content quality matters** — proper Umlaute, legal precision, no machine-translation feel.
|
||
6. **HTML-first, JS-enhanced** — server-rendered TSX with per-page client TS bundles. No react-query, no heavy client frameworks.
|
||
|
||
---
|
||
|
||
## Phase 0: Aktenverwaltung Foundation (shipped April 2026)
|
||
|
||
Ported and rebuilt from the retired KanzlAI prototype. Detailed phase breakdown and acceptance criteria live in `docs/design-kanzlai-integration.md` §8 (Phases A–J); this roadmap is the user-facing summary.
|
||
|
||
### 0.1 Akten (Matter Management) — office-scoped ✅ Done (2026-04-16, Phases A–D)
|
||
|
||
Persistent Akten (previously "cases" / "Mandate") with Parteien, audit trail (Verlauf), and per-Akte visibility. Every Akte has an `owning_office`, an explicit `collaborators` list, and a partner-togglable `firm_wide_visible` flag. Visibility is enforced both in Supabase RLS (`paliad.can_see_akte(akte_id)`) and at the application layer for defense in depth.
|
||
|
||
Shipped in Phases A (schema + RLS), B (services + sqlx pool), C (Fristenrechner → DB), D (Akten CRUD + onboarding + collaborator picker).
|
||
|
||
### 0.2 Fristen (Persistent Deadline Management) ✅ Done (2026-04-16, Phase E)
|
||
|
||
Persistent Frist list with traffic-light cards (rot / amber / grün / grau), detail page, month calendar, bulk-import from Fristenrechner ("Als Frist(en) speichern"). Visibility inherits from the parent Akte. Every mutation appends an `akten_events` row.
|
||
|
||
### 0.3 Termine + CalDAV Sync ✅ Done (2026-04-17, Phase F)
|
||
|
||
Termine CRUD (dual-mode: Akte-attached or personal), list/detail/calendar views, per-user CalDAV configuration. Bidirectional sync with a per-user goroutine on a 60s tick. Credentials encrypted at rest with AES-GCM keyed off `CALDAV_ENCRYPTION_KEY` (KanzlAI audit §1.3 fix). Passwords never returned in API responses.
|
||
|
||
### 0.4 Dashboard (Logged-in Landing) ✅ Done (2026-04-16, Phase G)
|
||
|
||
Server-rendered `/dashboard` for authenticated users: Frist summary (traffic lights), Akten summary, upcoming Fristen and Termine (7d), recent Verlauf. Zero client-side waterfall (audit §2.3 fix).
|
||
|
||
### 0.5 AI-assisted Frist-Extraktion — Deferred (Phase H)
|
||
|
||
Anthropic-based extraction of Fristen from uploaded court documents. **Not in current scope** — decision by m on 2026-04-16: "We don't want Anthropic API. We put this off for a while." The Dokumente tab on Akten detail stays as a "Kommt bald" placeholder. No `ANTHROPIC_API_KEY` needed on Dokploy today.
|
||
|
||
Open when revisiting: document upload + Supabase Storage alone (without AI) may still be worth shipping as a standalone Dokumente feature.
|
||
|
||
### 0.6 Notizen (polymorphic) — Pending (Phase I)
|
||
|
||
Schema exists (migration 005: `paliad.notizen` with polymorphic FK + CHECK constraint, RLS inherits from parent). Service, handlers, and UI component not yet shipped. Sized at ~4h in the integration design; pick up when cross-cutting notes become the next friction point.
|
||
|
||
---
|
||
|
||
## Phase 1: Foundation (Low effort, High impact)
|
||
|
||
Feature specs from the original roadmap. Items marked **✅ Done** were shipped in the pre-Aktenverwaltung April 2026 content push.
|
||
|
||
### 1.1 Link Hub ("Nützliche Links") ✅ Done (2026-04-14)
|
||
|
||
Curated, categorized page of external links relevant to daily patent practice. Categories cover Gerichte & Ämter, Recherche, UPC, Gesetze, and HL Intern. Lives at `/links`. Includes the youpc.org case-law entry that replaces the dropped §2.3 item. Users can suggest new links via an inline form.
|
||
|
||
### 1.2 More Downloads ✅ Done (page shipped — content pending)
|
||
|
||
Dedicated `/downloads` page with card-grid layout shipped (2026-04-14, `fd25998`). Current registry still holds only **HL Patents Style.dotm** — adding BuildingBlocks, legal writing templates, and the original Patentprozesskostenrechner.xlsm is a one-line registry edit per file, pending content selection from mWorkRepo.
|
||
|
||
### 1.3 Gebührentabellen (Fee Schedule Reference) ✅ Done (2026-04-14)
|
||
|
||
Interactive, tabbed fee schedule reference at `/tools/gebuehrentabellen`: GKG / RVG / UPC / EPA / PatKostG, with Streitwert quick-lookup and sortable tables per schedule version.
|
||
|
||
### 1.4 Patentglossar (DE/EN) ✅ Done (2026-04-14)
|
||
|
||
Searchable bilingual glossary at `/glossar` with client-side filter, category tags (prosecution / litigation / UPC / EPA), and a "Begriff vorschlagen" feedback form. Loaded from static JSON at server startup.
|
||
|
||
### 1.5 Kostenrechner Enhancements ✅ Partial (2026-04-14)
|
||
|
||
- **PDF Export** — shipped (print CSS).
|
||
- **Scenario Comparison** — shipped (side-by-side diff).
|
||
- **URL Sharing** — shipped (query-param state).
|
||
- **Prozesskostensicherheit** — pending. Calculation logic not yet implemented; only the glossary term exists. Kühnen 16th ed. Rn. E.47 ff. formula is still the target reference.
|
||
|
||
---
|
||
|
||
## Phase 2: Content Hub (Medium effort, High impact)
|
||
|
||
### 2.1 Verfahrensleitfäden (Procedure Guides) — Pending
|
||
|
||
Step-by-step visual guides for UPC Infringement, UPC Revocation, UPC Provisional Measures, German Infringement, German Nullity, EPA Opposition, EPA Appeal. Timeline + step descriptions + cross-links to Fristenrechner pre-filled for the proceeding type. Content exists in mWorkRepo (UPC Know-How, UPC Training); needs structuring.
|
||
|
||
**Effort:** ~8h code + ~6h content per guide | **Impact:** Very High
|
||
|
||
### 2.2 Gerichtsverzeichnis (Court Directory) ✅ Done (2026-04-16)
|
||
|
||
Reference page at `/gerichte` with entries for every relevant UPC division, German court (LG / OLG / BGH / BPatG), DPMA, EPA, and national courts in NL / UK / FR / IT. Searchable + filterable by type and country.
|
||
|
||
### 2.3 UPC Rechtsprechungsübersicht — Dropped
|
||
|
||
Explicitly removed 2026-04-16. Rationale: youpc.org already maintains a curated UPC case-law database with 1,600+ decisions. Replaced with a prominent youpc.org entry in the Link Hub under "Recherche" (commit `4526942`). Re-add only if youpc.org shuts down or if HLC needs firm-specific takeaways attached to decisions.
|
||
|
||
### 2.4 Checklisten (Interactive Checklists) ✅ Done (2026-04-16)
|
||
|
||
Interactive checklists at `/checklisten` for UPC Statement of Claim, Statement of Defence, Confidentiality Application, Representative Registration, BPatG nullity, EPA Opposition, nUPCMS filing. Checkbox state persisted in `localStorage` per user; print-friendly layout; feedback form per list.
|
||
|
||
---
|
||
|
||
## Phase 3: Platform Features (Higher effort, Transformative)
|
||
|
||
### 3.1 Suchfunktion (Global Search) — Pending
|
||
|
||
Search across all Paliad content — glossary, Gerichte, Leitfäden, Checklisten, links, and eventually Akten (scoped by visibility). Build the index at startup from JSON sources + DB. Expose `GET /api/search?q=...`.
|
||
|
||
**Effort:** ~6h | **Impact:** High
|
||
|
||
### 3.2 Vorlagenbibliothek (Template Library) — Pending
|
||
|
||
Evolve `/downloads` from a flat card grid into a proper template library with preview, category filters (Schriftsätze, Vorlagen, Tabellen, Blöcke), and metadata. Distribution channel for the HL Model Documents project and BuildingBlocks.
|
||
|
||
**Effort:** ~8h | **Impact:** High
|
||
|
||
### 3.3 Schulungsbereich (Training Hub) — Pending
|
||
|
||
Self-serve onboarding and continuing education at `/schulung`. New-associate guide, UPC training material, video guide links, HL Patents Style tutorial, nUPCMS filing guide, FAQ.
|
||
|
||
**Effort:** ~6h code + ~10h content | **Impact:** Medium-High
|
||
|
||
### 3.4 Benachrichtigungen (What's New) — Pending
|
||
|
||
Changelog + "neu seit letztem Besuch" badge in the sidebar. JSON-backed changelog, `localStorage` last-seen timestamp, optional browser push.
|
||
|
||
**Effort:** ~3h | **Impact:** Medium (retention)
|
||
|
||
---
|
||
|
||
## Phase 4: Advanced (High effort, Long-term)
|
||
|
||
### 4.1 KI-Recherche (AI-Powered Research) — Pending (AI features deferred alongside Phase H)
|
||
|
||
Claude-powered chat grounded in Paliad content (glossary, guides, case law, fee tables, and — with visibility enforcement — a user's own Akten/Fristen). Every answer cites sources. Requires guardrails; requires a solid content foundation (Phases 1–3). Currently blocked by the same "no Anthropic API" decision as Phase H; revisit when that decision flips.
|
||
|
||
### 4.2 Fristenkalender ✅ Done (Phase F)
|
||
|
||
Originally "export deadlines as .ics / CalDAV sync". Subsumed by Phase 0.3 Termine + CalDAV Sync — bidirectional sync with encrypted credentials at rest. The Fristenrechner's "Als Frist(en) speichern" button is the entry point from quick-calc into persistent Fristen; Fristen themselves appear in the user's CalDAV calendar via Termine linkage.
|
||
|
||
### 4.3 Collaborative Annotations — Pending (partial via 0.6 Notizen)
|
||
|
||
The polymorphic `paliad.notizen` table already covers per-Akte / per-Frist / per-Termin / per-AkteEvent notes (Phase I). "Annotations on published knowledge content" (e.g., per-glossary-term practitioner tips) is a separate scope and still pending. Requires moderation UI.
|
||
|
||
### 4.4 Mandantenkosten-Report (Client Cost Report) — Pending
|
||
|
||
Branded PDF cost estimate generated from Kostenrechner data: HL logo, matter reference, date, scenario comparison, editable cover letter. One-click replacement for today's manual Excel-to-memo workflow.
|
||
|
||
**Effort:** ~10h | **Impact:** Medium-High (client-facing)
|
||
|
||
---
|
||
|
||
## Prioritized Backlog
|
||
|
||
Phase 0 (Aktenverwaltung) items are **Done** as of April 2026. Remaining work ordered by priority.
|
||
|
||
| # | Feature | Phase | Effort | Impact | Priority | Status |
|
||
|---|---|---|---|---|---|---|
|
||
| 0.1 | Akten (matter mgmt) | 0 | — | Foundational | **P0** | ✅ Done |
|
||
| 0.2 | Fristen (persistent) | 0 | — | Foundational | **P0** | ✅ Done |
|
||
| 0.3 | Termine + CalDAV | 0 | — | High | **P0** | ✅ Done |
|
||
| 0.4 | Dashboard | 0 | — | High | **P0** | ✅ Done |
|
||
| 1.1 | Link Hub | 1 | 2h | High | **P0** | ✅ Done |
|
||
| 1.3 | Gebührentabellen | 1 | 4h | Med-High | **P0** | ✅ Done |
|
||
| 1.4 | Patentglossar | 1 | 5h | Medium | **P1** | ✅ Done |
|
||
| 2.2 | Gerichtsverzeichnis | 2 | 8h | Med-High | **P1** | ✅ Done |
|
||
| 2.4 | Checklisten | 2 | 7h | High | **P1** | ✅ Done |
|
||
| 1.5 | Kostenrechner enhancements | 1 | 6h | High | **P1** | ✅ Partial (PDF/URL/compare done; Prozesskostensicherheit pending) |
|
||
| 1.2 | More Downloads (content) | 1 | 1h/file | Medium | **P1** | ⬜ Page shipped; content pending |
|
||
| 0.6 | Notizen (service + UI) | 0 | 4h | Medium | **P2** | ⬜ Schema done, service pending |
|
||
| 2.1 | Verfahrensleitfäden | 2 | 14h | Very High | **P2** | ⬜ Pending |
|
||
| 3.4 | Benachrichtigungen | 3 | 3h | Medium | **P2** | ⬜ Pending |
|
||
| 3.1 | Suchfunktion | 3 | 6h | High | **P3** | ⬜ Pending |
|
||
| 3.2 | Vorlagenbibliothek | 3 | 8h | High | **P3** | ⬜ Pending |
|
||
| 3.3 | Schulungsbereich | 3 | 16h | Med-High | **P3** | ⬜ Pending |
|
||
| 4.4 | Mandantenkosten-Report | 4 | 10h | Med-High | **P3** | ⬜ Pending |
|
||
| 0.5 | AI Frist-Extraktion (Phase H) | 0 | 4h | High | **Deferred** | ⏸ Anthropic API decision pending |
|
||
| 4.1 | KI-Recherche | 4 | 20h | Transformative | **Deferred** | ⏸ Tied to Phase H decision |
|
||
| 4.3 | Collaborative Annotations (published content) | 4 | 15h | High | **P4** | ⬜ Pending |
|
||
|
||
---
|
||
|
||
## Architecture Notes
|
||
|
||
### Data Strategy
|
||
|
||
The data model is split:
|
||
|
||
- **Phase 0 (Aktenverwaltung)** — Supabase tables in the `paliad` schema with office-scoped RLS (`paliad.can_see_akte(akte_id)`). User-generated data lives here: Akten, Fristen, Termine, Parteien, Dokumente, Notizen, Verlauf, User profiles, CalDAV config. Migrations embedded into the Go binary via `embed.FS` and applied by `golang-migrate` at server startup.
|
||
- **Knowledge platform (Phases 1–2)** — static JSON data loaded at server startup. Content lives in git; content updates = git commits = automatic deploy.
|
||
- **Feedback tables** (`link_suggestions`, `checklisten_feedback`, `gerichte_feedback`) — `paliad` schema, firm-wide visibility.
|
||
|
||
When static content grows past what's practical in JSON (Phase 3+), migrate specific content types to Supabase tables with a simple admin API. Don't mass-migrate — move what benefits from search/filtering/mutation.
|
||
|
||
### Visibility Invariant
|
||
|
||
The office-scoped visibility predicate is **defined once** in SQL (`paliad.can_see_akte(akte_id uuid)`) and reused by every RLS policy on every table that carries an `akte_id`. `AkteService.GetByID` mirrors the predicate at the application layer for defense in depth; every child service (`FristService`, `TerminService`, `ParteienService`, …) routes through `AkteService.GetByID` before operating on its own row. **Never duplicate the predicate.** See `docs/design-kanzlai-integration.md` §2 and the Phase E memory episode for the architecture invariant.
|
||
|
||
### Content Pipeline
|
||
|
||
New knowledge content follows this flow:
|
||
1. Practitioner identifies need (or new case law / template).
|
||
2. Content written/curated (by knowledge lawyer or contributor).
|
||
3. Added to Paliad repo as JSON/markdown.
|
||
4. PR reviewed and merged.
|
||
5. Auto-deploy via Dokploy webhook (push to `main` → Gitea webhook → Dokploy).
|
||
|
||
### Navigation
|
||
|
||
The sidebar has six grouped sections (see `docs/design-kanzlai-integration.md` §6):
|
||
|
||
```
|
||
— ÜBERSICHT —
|
||
Dashboard
|
||
|
||
— ARBEIT —
|
||
Akten
|
||
Fristen
|
||
Termine
|
||
|
||
— WERKZEUGE —
|
||
Kostenrechner
|
||
Fristenrechner (stateless quick calc; distinct from /fristen)
|
||
Gebührentabellen
|
||
|
||
— WISSEN —
|
||
Glossar
|
||
Checklisten
|
||
Gerichtsverzeichnis
|
||
Leitfäden (future — Phase 2.1)
|
||
|
||
— RESSOURCEN —
|
||
Downloads
|
||
Nützliche Links
|
||
|
||
— EINSTELLUNGEN —
|
||
CalDAV
|
||
```
|
||
|
||
### What Paliad Is
|
||
|
||
Paliad is the all-in-one platform for HLC patent practice:
|
||
|
||
- **Knowledge platform** — curated content, practical tools, quick reference (Glossar, Gebührentabellen, Checklisten, Gerichtsverzeichnis, Leitfäden, Links, Downloads).
|
||
- **Aktenverwaltung** — Akten, Fristen, Termine, Parteien, Dokumente, Notizen, Verlauf (audit trail). Office-scoped visibility with explicit collaborator lists for cross-office teams. Personal calendar sync via CalDAV. AI-assisted Frist extraction is designed but deferred.
|
||
|
||
What Paliad is *not*:
|
||
|
||
- **Not a billing tool** — HLC has firm-wide billing infrastructure.
|
||
- **Not a beA gateway** — out of scope; lawyers use existing beA software.
|
||
- **Not a document management system** — SharePoint / netDocuments stay in their lane.
|
||
- **Not a CMS** — content lives in git, not a database with a CMS UI.
|
||
|
||
---
|
||
|
||
## Longer-Term Open Questions
|
||
|
||
- **Outlook / Exchange sync (Phase K).** CalDAV covers Apple iCloud + `dav.msbls.de`. HLC lives on Outlook + Exchange; Exchange's CalDAV support is limited. A follow-on "Phase K" would add an EWS / Microsoft Graph backend behind the same sync abstraction. Decide based on internal feedback to Phase F.
|
||
- **Practice-group walls.** Today, `practice_group` is filter-only metadata. If a partner asks for "Patents Litigation can't see Patents Prosecution Akten", the schema is ready to extend the `paliad.can_see_akte` predicate. Don't build until asked.
|
||
- **External counsel access.** Bringing in an outside boutique on a specific Akte currently means adding them as a user (not possible without the HLC email domain). A future `external_collaborators` table with scoped RLS would cover it.
|
||
- **Read-only archive post-closure.** Add `is_archived` on `paliad.akten`, deny mutations via RLS. Cheap follow-on.
|
||
- **AI revisit.** The Phase H / 4.1 pause is a decision, not a technical block. When Anthropic API goes back on the table, both AI extraction (Phase H) and KI-Recherche (4.1) can be unblocked.
|
||
- **Supabase Auth SMTP routing.** Confirmation / password-reset / magic-link mails from `ydb.youpc.org` still go through Supabase's default sender. Routing them through Paliad's SMTP (`mail@paliad.de`) is a one-line GoTrue config change, but youpc's Supabase is shared with youpc.org, so the global SMTP settings can't be flipped without rebranding youpc.org's auth mails too. Resolution paths (lowest-effort first):
|
||
1. Move Paliad to its own Supabase project and configure SMTP there.
|
||
2. Wait until the youpc instance exposes per-project SMTP (Supabase Pro / self-hosted upgrade).
|
||
3. Write a custom GoTrue webhook that Paliad's Go server intercepts and re-sends via `MailService`.
|
||
|
||
For now the inbox-facing mails (reminders + invitations) go through Paliad's SMTP; identity-bootstrap mails stay on the default sender — acceptable for the current HLC pilot. Tracked as part of t-paliad-021 completion (2026-04-20).
|