docs: create milestone v1.1 roadmap (5 phases)

This commit is contained in:
2026-07-17 12:54:48 +02:00
parent 21cae97ca0
commit eb3ed949a9
3 changed files with 150 additions and 13 deletions
+33 -1
View File
@@ -74,4 +74,36 @@
## Traceability
_(Wird vom Roadmapper befüllt: REQ-ID → Phase.)_
| Requirement | Phase | Status |
|-------------|-------|--------|
| CONFIG-01 | Phase 10 | Pending |
| INGEST-01 | Phase 10 | Pending |
| INGEST-06 | Phase 10 | Pending |
| SCHEMA-01 | Phase 10 | Pending |
| SCHEMA-02 | Phase 10 | Pending |
| FILTER-01 | Phase 11 | Pending |
| FILTER-02 | Phase 11 | Pending |
| FILTER-03 | Phase 11 | Pending |
| FILTER-04 | Phase 11 | Pending |
| FILTER-05 | Phase 11 | Pending |
| FILTER-06 | Phase 11 | Pending |
| UI-01 | Phase 11 | Pending |
| UI-02 | Phase 11 | Pending |
| UI-03 | Phase 11 | Pending |
| UI-04 | Phase 11 | Pending |
| UI-05 | Phase 11 | Pending |
| NOTIFY-01 | Phase 12 | Pending |
| NOTIFY-02 | Phase 12 | Pending |
| NOTIFY-03 | Phase 12 | Pending |
| NOTIFY-04 | Phase 12 | Pending |
| INGEST-02 | Phase 13 | Pending |
| INGEST-03 | Phase 13 | Pending |
| INGEST-07 | Phase 13 | Pending |
| SCHEMA-03 | Phase 13 | Pending |
| INGEST-04 | Phase 14 | Pending |
| INGEST-05 | Phase 14 | Pending |
| CONFIG-02 | Phase 14 | Pending |
| CONFIG-03 | Phase 14 | Pending |
| UI-06 | Phase 14 | Pending |
**Coverage:** 29/29 v1.1 requirements mapped — no orphans.
+98 -2
View File
@@ -2,7 +2,12 @@
## Overview
Tessera delivers a modular portal platform where tenants activate workflow modules from a marketplace, interact through a configurable dashboard, and optionally use a desktop wrapper. The roadmap builds foundation-first (Docker + DB + shell), layers in authentication and multi-tenancy, establishes the module system with a proof-of-concept module, adds marketplace and portal navigation, delivers the dashboard experience, and wraps up with desktop client and CI/CD integration.
Tessera delivers a modular portal platform where tenants activate workflow modules from a marketplace, interact through a configurable dashboard, and optionally use a desktop wrapper. The roadmap builds foundation-first (Docker + DB + shell), layers in authentication and multi-tenancy, establishes the module system with a proof-of-concept module, adds marketplace and portal navigation, delivers the dashboard experience, and wraps up with desktop client and CI/CD integration. The v1.1 Ausschreibungs-Radar milestone (Phases 10-14) adds a new module that aggregates German public tenders from DÖE OpenData plus AI-AG NetServer, cosinex, RSS, and email-alert sources into one normalized, filterable, notifiable catalog -- shipped DÖE-first as a legally-clean, demoable MVP, then layered with scraping adapters and finally the long-tail RSS/email sources.
## Milestones
- ✅ **v1.0 MVP** - Phases 1-9 (shipped 2026-07-02)
- 🚧 **v1.1 Ausschreibungs-Radar** - Phases 10-14 (in progress)
## Phases
@@ -22,6 +27,11 @@ Decimal phases appear between their surrounding integers in numeric order.
- [x] **Phase 7: DKV Fleet Module** - Automated DKV invoice processing via email monitoring, PDF parsing, and Excel export with driver mapping (completed 2026-06-27)
- [x] **Phase 8: Dashboard Widgets Vollimplementierung** - Calculator, Favorites, and Stopwatch widgets plus unified grid constraints across all dashboard widgets (completed 2026-07-01)
- [x] **Phase 9: Cert Manager Module** - Server-side certificate toolkit: upload/paste, inspect, split chains, merge/bundle, convert formats, password-protected PFX support (completed 2026-07-02)
- [ ] **Phase 10: Ausschreibungs-Radar Foundation & DÖE Ingestion** - Normalized DÖE tender ingestion on a multi-tenant-safe shared schedule, module activatable from the marketplace
- [ ] **Phase 11: Filter Engine, Results UI & Saved Searches** - Searchable/filterable tender results, personal saved search profiles, per-user read/favourite triage
- [ ] **Phase 12: Tender Notifications** - Configurable digest and instant email alerts without duplicate sends or backfill floods
- [ ] **Phase 13: Scraping Adapters & Cross-Source Deduplication** - AI-AG NetServer + cosinex adapters with fuzzy cross-source dedup and a hard denylist for banned portals
- [ ] **Phase 14: RSS, Email-Alert Ingestion & Module Rollout** - RSS + email-alert long tail, admin source/mailbox config, excluded-portal transparency, i18n
## Phase Details
@@ -320,10 +330,91 @@ Plans:
**UI hint**: yes
### Phase 10: Ausschreibungs-Radar Foundation & DÖE Ingestion
**Goal:** The platform ingests German public tenders from the DÖE OpenData API on a shared, multi-tenant-safe schedule into a normalized, platform-global schema, and the module can be activated per tenant from the marketplace.
**Mode:** mvp
**Depends on**: Phase 9 (existing platform infrastructure: module registry, multi-tenancy, mail/SMTP)
**Requirements**: CONFIG-01, INGEST-01, INGEST-06, SCHEMA-01, SCHEMA-02
**Success Criteria** (what must be TRUE):
1. Admin can find "Ausschreibungs-Radar" in the marketplace and activate it for a tenant, same as the DKV-Fleet/Cert-Manager modules
2. New DÖE OpenData tenders appear as normalized records (title, buyer, CPV codes, region/PLZ, deadline, estimated value, procedure type, source URL) after a poll cycle -- tender data is platform-global, not tied to any one tenant
3. A DÖE tender that changes on the source side (e.g. deadline extension, cancellation) updates the existing record via content-hash change detection instead of creating a duplicate
4. DÖE is polled once on a shared, admin-configurable interval regardless of how many tenants have the module active -- never once per tenant (poll-once-fan-out-many, not the DKV single-tenant `findFirst()` pattern)
5. Activating the module for a second tenant does not duplicate ingestion, re-trigger a redundant DÖE poll, or interfere with the first tenant's data
**Plans**: TBD
### Phase 11: Filter Engine, Results UI & Saved Searches
**Goal:** Users can search, filter, and personally triage DÖE tender results, and save reusable filter combinations as personal search profiles, with the UI transparently communicating data coverage.
**Mode:** mvp
**Depends on**: Phase 10
**Requirements**: FILTER-01, FILTER-02, FILTER-03, FILTER-04, FILTER-05, FILTER-06, UI-01, UI-02, UI-03, UI-04, UI-05
**Success Criteria** (what must be TRUE):
1. User sees a searchable, sortable results list (by deadline, value, publish date) and can filter by keyword, region/PLZ/Bundesland, CPV code (hierarchical, with autocomplete), deadline, and estimated value -- tenders with no value stated are handled gracefully, not excluded or errored
2. User can open a detail view for any tender showing the source link and any document URLs present in the notice (no local mirroring of Vergabeunterlagen)
3. User can save a combination of filter criteria as a named search profile and later edit or delete it -- profiles are personal (per user) and scoped to their own tenant
4. User can mark a tender as read/unread and as favourite, and filter the results list to only favourites -- both states are per-user, not shared across the tenant
5. The UI clearly indicates data coverage (Oberschwelle vs. Unterschwelle) so an empty or thin result set isn't mistaken for a bug
**Plans**: TBD
**UI hint**: yes
### Phase 12: Tender Notifications
**Goal:** Users are proactively notified by email about new matching tenders, via a configurable digest and/or instant alert, without duplicate sends or backfill floods, using the tenant's own SMTP configuration.
**Mode:** mvp
**Depends on**: Phase 11
**Requirements**: NOTIFY-01, NOTIFY-02, NOTIFY-03, NOTIFY-04
**Success Criteria** (what must be TRUE):
1. User receives a periodic email digest of new matches for their active search profiles, with the interval configurable in the web interface
2. User can enable an instant email alert per search profile and receives a single email shortly after a new match against that profile
3. Activating a new search profile with many pre-existing historical matches does not flood the user with individual emails -- backfill is suppressed/batched on first activation, and a match already notified once (digest or instant) is never notified again for the same tender+profile pair (explicit matched-vs-notified state)
4. Notification emails are sent through the tenant's own SMTP configuration (reusing the DKV mail pattern), not a shared/global system mailer
**Plans**: TBD
**UI hint**: yes
### Phase 13: Scraping Adapters & Cross-Source Deduplication
**Goal:** The platform expands tender coverage with AI-AG NetServer and cosinex portal adapters and collapses tenders seen on multiple sources into a single entry, while structurally refusing to ever scrape the AGB-prohibited portals.
**Mode:** mvp
**Depends on**: Phase 12
**Requirements**: INGEST-02, INGEST-03, INGEST-07, SCHEMA-03
**Success Criteria** (what must be TRUE):
1. Tenders from AI-AG NetServer portals (lhs-vpbw, tender24, vergabe.landbw) appear as additional, correctly normalized results via one config-driven adapter
2. Tenders from the cosinex Vergabemarktplatz (DTVP) appear as additional, correctly normalized results via a separate config-driven adapter
3. A tender that appears via both DÖE and a scraping adapter shows up once in the results list (fuzzy fingerprint dedup on buyer+title+CPV+deadline+value), with links to all of its source portals -- dedup logic only activates once a second source is live
4. Attempting to register vergabe24 or aumass as a poll source is refused by the system itself (adapter registry denylist enforced in code), not just documented as forbidden
**Plans**: TBD
### Phase 14: RSS, Email-Alert Ingestion & Module Rollout
**Goal:** The platform rounds out Unterschwelle long-tail coverage via RSS feeds and per-tenant email-alert mailboxes (reusing a shared inbox module extracted from DKV), admins can manage source and mailbox configuration per tenant, excluded portals are shown transparently, and the whole module is bilingual.
**Mode:** mvp
**Depends on**: Phase 13
**Requirements**: INGEST-04, INGEST-05, CONFIG-02, CONFIG-03, UI-06
**Success Criteria** (what must be TRUE):
1. Tenders from the RSS feeds subreport-elvis and service.bund.de appear automatically in the results list
2. Tenders parsed from a configured mailbox's portal-alert emails appear automatically in the results list -- built on a shared `inbox/` module, extracted as a one-time prerequisite refactor from DKV's `ImapProvider`/`ExchangeInboxProvider` (previously living inside `dkv/`)
3. Admin can manage per-tenant source poll configuration and the email-alert ingestion mailbox, with credentials stored encrypted (same AES-256-GCM pattern as `DkvModuleConfig`)
4. vergabe24 and aumass are shown in the UI as "manually monitor" with a direct link, instead of appearing as a silent coverage gap
5. The entire module UI (results list, filters, saved searches, settings) is fully usable in both German and English
**Plans**: TBD
**UI hint**: yes
## Progress
**Execution Order:**
Phases execute in numeric order: 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9
Phases execute in numeric order: 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -> 12 -> 13 -> 14
| Phase | Plans Complete | Status | Completed |
|-------|----------------|--------|-----------|
@@ -336,3 +427,8 @@ Phases execute in numeric order: 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9
| 7. DKV Fleet Module | 6/6 | Complete | 2026-06-27 |
| 8. Dashboard Widgets Vollimplementierung | 4/4 | Complete | 2026-07-01 |
| 9. Cert Manager Module | 6/6 | Complete | 2026-07-02 |
| 10. Ausschreibungs-Radar Foundation & DÖE Ingestion | 0/TBD | Not started | - |
| 11. Filter Engine, Results UI & Saved Searches | 0/TBD | Not started | - |
| 12. Tender Notifications | 0/TBD | Not started | - |
| 13. Scraping Adapters & Cross-Source Deduplication | 0/TBD | Not started | - |
| 14. RSS, Email-Alert Ingestion & Module Rollout | 0/TBD | Not started | - |
+19 -10
View File
@@ -3,10 +3,10 @@ gsd_state_version: 1.0
milestone: v1.1
milestone_name: Ausschreibungs-Radar
status: planning
last_updated: "2026-07-17T07:57:59.935Z"
last_updated: "2026-07-17T08:45:00.000Z"
last_activity: 2026-07-17
progress:
total_phases: 0
total_phases: 5
completed_phases: 0
total_plans: 0
completed_plans: 0
@@ -17,17 +17,19 @@ progress:
## Project Reference
See: .planning/PROJECT.md (updated 2026-06-18)
See: .planning/PROJECT.md (updated 2026-07-17)
**Core value:** Eine zentrale Plattform, in der beliebige Workflow-Tools als Module lizenziert, aktiviert und genutzt werden koennen -- ohne zwischen verschiedenen Anwendungen wechseln zu muessen.
**Current focus:** Phase 9 — cert-manager-module
**Current focus:** Phase 10 — Ausschreibungs-Radar Foundation & DÖE Ingestion
## Current Position
Phase: Not started (defining requirements)
Plan: —
Status: Defining requirements
Last activity: 2026-07-17 — Milestone v1.1 started
Phase: 10 of 14 (Ausschreibungs-Radar Foundation & DÖE Ingestion)
Plan: — (not yet planned)
Status: Ready to plan
Last activity: 2026-07-17 — ROADMAP.md created for v1.1 (Phases 10-14), 29 requirements mapped, 100% coverage
Progress: [░░░░░░░░░░] 0%
## Performance Metrics
@@ -73,7 +75,13 @@ Last activity: 2026-07-17 — Milestone v1.1 started
Decisions are logged in PROJECT.md Key Decisions table.
Recent decisions affecting current work:
- [Roadmap]: 6 phases derived from 44 v1 requirements, standard granularity
- [Roadmap v1.1]: 5 phases (10-14) derived from 29 v1.1 requirements, standard granularity — DÖE-only MVP (10: ingestion, 11: filter/UI, 12: notifications) ships first as legally-clean demoable slice, then scraping adapters + cross-source dedup (13), then RSS + email-alert long tail (14)
- [Roadmap v1.1]: Tender data modeled as platform-global (no tenantId on Tender) — only TenderSavedSearch/TenderMatch are tenant+user-scoped; deviates deliberately from the DKV per-tenant template
- [Roadmap v1.1]: Scheduler must be poll-once-fan-out-many from Phase 10 onward — explicitly NOT the DKV `findFirst()` single-tenant pattern (documented pitfall)
- [Roadmap v1.1]: Notification phase (12) requires an explicit matched-vs-notified state with backfill suppression to avoid first-activation email floods and duplicate digest+instant sends
- [Roadmap v1.1]: INGEST-07 (vergabe24/aumass hard denylist) enforced in the adapter registry in Phase 13, not just documented
- [Roadmap v1.1]: inbox/ module extraction (ImapProvider/ExchangeInboxProvider out of dkv/) scoped as a one-time prerequisite refactor inside Phase 14, not done earlier
- [Roadmap]: 6 phases derived from 44 v1.0 requirements, standard granularity
- [Roadmap]: Research recommends NestJS + Next.js + PostgreSQL RLS + Keycloak + Tauri stack
- [01-01]: Used Traefik v2.11 instead of v3.4 due to Docker API version incompatibility on host
- [01-01]: Traefik placed on frontend-net + backend-net for routing to both web and api services
@@ -133,7 +141,8 @@ None yet.
### Blockers/Concerns
None yet.
- [Roadmap v1.1]: DÖE OpenData API pagination/rate-limit parameters unverified (Swagger UI is JS-rendered) — resolve via a live API call during Phase 10 planning, not assumed from docs.
- [Roadmap v1.1]: Whether AI-AG NetServer / cosinex VMP search pages require JS rendering is unverified — needs a Phase 13 start-of-phase spike before committing to playwright.
### Quick Tasks Completed