Files
paliad/docs/feature-roadmap.md
m 11217f7bfa feat: email service — SMTP + deadline reminders + invitations (t-paliad-021)
- 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.
2026-04-20 12:34:38 +02:00

303 lines
19 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 (AD) | 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 AJ); this roadmap is the user-facing summary.
### 0.1 Akten (Matter Management) — office-scoped ✅ Done (2026-04-16, Phases AD)
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 13). 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 12)** — 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).