Zuletzt aktualisiert:

Projektmanagement & Ticketsystem für Silverscale

Recherche (Stand 2026-06-10): Wie wandern Backlog + Roadmap aus den Markdown-Dateien (app/ios-native/BACKLOG.md + ROADMAP.md, kuratiert über /groom) in ein echtes Projektmanagement mit visueller Roadmap und Tickets mit mehr State — ohne den wichtigsten Hebel zu verlieren: dass die KI-Agenten (MacClaude/StratoClaude) die Tickets programmatisch lesen UND schreiben können. Interface-Präferenz ist ausdrücklich etwas Besseres als MCP: bewertet wird primär nach CLI-Ergonomie und/oder per curl nutzbarer HTTP-API.


Kurz-Fazit / Empfehlung

Empfehlung: Plane (self-hosted, Docker), bedient von den Agenten ausschließlich über die REST-API per curl — plus ein dünner pm.sh-Wrapper im Stil von app/bus.sh.

Plane ist 2026 das einzige Tool im Feld, das alle vier harten Anforderungen gleichzeitig erfüllt: (1) echte visuelle Roadmap (Timeline/Cycles/Boards), (2) Tickets mit viel State (Status-Workflow, Custom Properties für Owner/Welle/ADR-Refs, Kommentare, Verlinkungen), (3) datensouverän self-hosted unter Docker/Traefik mit identischer API wie die Cloud, und (4) eine schlanke, gleichförmige REST-API (X-API-Key-Header, JSON, vorhersehbare Resource-URLs), die ein LLM-Agent ohne MCP-Server-Lifecycle direkt per curl bedient.

So arbeitet der Agent als Konsument + Producer (Self-hosted-Basis-URL = https://pm.dennisfisch.de, Token in der .env):

# ENV einmalig: PLANE=https://pm.dennisfisch.de  WS=silverscale  PROJ=<project_id>
H=(-H "X-API-Key: $PLANE_API_KEY" -H "Content-Type: application/json")

# LESEN — offene Tickets der MacClaude-Welle als JSON ziehen
curl -s "${H[@]}" \
  "$PLANE/api/v1/workspaces/$WS/projects/$PROJ/work-items/?state__group=unstarted" | jq '.results[].name'

# ANLEGEN — neues Ticket (entspricht einem B-NN-Harvest)
curl -s "${H[@]}" -X POST \
  "$PLANE/api/v1/workspaces/$WS/projects/$PROJ/work-items/" \
  -d '{"name":"Pin-Semantik: gepinnt + low Signal → unsicher vorschlagen","priority":"none"}'

# STATUS SETZEN — Ticket auf „in Arbeit" / „erledigt"
curl -s "${H[@]}" -X PATCH \
  "$PLANE/api/v1/workspaces/$WS/projects/$PROJ/work-items/$ID/" \
  -d '{"state":"<state_id_in_arbeit>"}'

# KOMMENTIEREN — Handoff-Notiz / Befund ans Ticket hängen (statt flüchtigem Handoff-Doc)
curl -s "${H[@]}" -X POST \
  "$PLANE/api/v1/workspaces/$WS/projects/$PROJ/work-items/$ID/comments/" \
  -d '{"comment_html":"<p>Gerätetest phase-5: 8✓/5🐞, Crash gefixt 72bf08c</p>"}'

Damit lebt der State im Ticketsystem statt in flüchtigen Handoff-Docs — genau das, was die Zwei-Sessions-Übergabe heute schwer macht. Der /groom-Skill bleibt als Sync-/Harvest-Skript relevant (Quellen scannen → Tickets anlegen/abhaken), Prio-Hoheit bleibt bei Dennis.

Wenn der visuelle Roadmap-Anspruch nachgibt und maximale Agent-Ergonomie + minimaler Footprint zählen: Vikunja ist die leichtgewichtige Alternative (ein einziges Go-Binary, Board/Gantt, sauberer JWT-Bearer-REST). Vikunjas CLI taugt aber NICHT für Ticketpflege (nur Migrationen/Admin) — Agenten müssen ohnehin über die REST-API. Plane gewinnt durch die deutlich reichere Roadmap-/State-Modellierung; Vikunja durch Ein-Personen-Wartbarkeit.


Vergleichstabelle

Bewertung gegen die Briefing-Dimensionen. „CLI/curl-Agent-Eignung" ist die Leitspalte.

Tool CLI/curl-Agent-Eignung (Leitkriterium) Self-Host-Aufwand (VPS/Docker/SSO) Roadmap-Visualisierung State pro Ticket / Custom Fields Bulk-Import (MD→Tickets) Lock-in / Wartung (1-Personen)
Plane Sehr gut. Saubere REST, X-API-Key-Header, JSON, vorhersehbare URLs; per curl voll skriptbar. Kein offizielles Ticket-CLI → eigener Wrapper trivial. Webhooks vorhanden. Mittel-hoch: ~13 Container (API, Web, Worker, Beat, Postgres, Redis/Valkey, MinIO, Proxy), 4 GB RAM min., 8 GB empfohlen. Externer Reverse-Proxy/Traefik geht. Stark: Timeline/Cycles, Boards (Kanban), Group-by, Modules. Stark: Status-Workflow (state groups), Custom Properties (Owner/Welle/ADR), Kommentare, Links, Sub-Items. API + Custom Properties → Skript-Import gut machbar; kein 1-Klick-MD-Import. Open-core (MIT-Kern), aktiv (47k★). Schwergewicht — Updates/Migrationen beobachten.
Vikunja Gut (nur API). REST Authorization: Bearer <JWT>, JSON, Import von Todoist/Trello/JSON. CLI nur Admin/Migration, NICHT für Tasks → Agent muss curl/REST. Niedrig: EIN Go-Binary (Frontend+Backend gebündelt) + Postgres/MySQL. Geringster Footprint. Mittel: Board (Kanban) + Gantt; keine echte Multi-Projekt-Roadmap-Timeline wie Plane. Mittel: Status über Kanban-Buckets/Labels; Custom Fields begrenzter als Plane. JSON-Import vorhanden; API-Skript einfach. AGPLv3, aktiv. Beste Wartbarkeit für Ein-Personen-Self-Host.
GitLab (Issues+Boards) Gut. REST v4 PRIVATE-TOKEN-Header (curl-freundlich) + offizielles glab-CLI (glab issue create/list). Webhooks. Hoch: RAM-hungrig (deutlich >4 GB), großer Stack. Overkill, wenn nur Issues gebraucht. Roadmap/Epics-Timeline nur in Ultimate (bezahlt); Boards frei. Issues + Labels + Milestones; Epics/Custom-Hierarchie premium. API-Import gut; viel Ballast (CI/Registry/etc.). Self-managed reif, aber schwere Wartung für ein Hobby-Setup. Lock-in moderat.
Linear Exzellent für Agenten (GraphQL-first, native MCP, linearis-CLI mit JSON + discover-then-act, token-sparsam). Cloud-only — kein Self-Host. Verstößt gegen Datensouveränität/Self-Host-Fit. Sehr gut (Projects/Roadmap/Cycles). Sehr gut. API-Import. Vendor-Lock-in + Cloud → für dieses Projekt disqualifiziert (nur als Benchmark).
Huly API vorhanden, aber 2026 schwächer dokumentiert; agentische curl-Ergonomie unklar/jung. Hoch: CockroachDB, Elasticsearch, Redpanda, MinIO; 8 GB RAM min, 16 GB empf. Schwer. Stark (Linear/Jira-Alternative). Stark. Unklar/jung. EPL-2.0, jung; schwerster Footprint, riskanteste Wartung solo.
Leantime JSON-RPC-API (transaktional, nicht resource-orientiert) → für Agenten unhandlicher als REST; kein agent-CLI. Mittel (PHP/MySQL). Goals/Roadmap-fokus, aber kein agent-starkes Board-API. Mittel. Begrenzt. Aktiv, ADHS/Fokus-Nische; API-Ergonomie schwach für LLM.
Focalboard API existiert, aber Projekt quasi eingefroren (in Mattermost aufgegangen); curl-Ergonomie mau. Niedrig-mittel. Nur Boards, keine Timeline. Schwach. Schwach. Wartungsrisiko (stagniert) → nicht empfohlen.
Taiga REST-API vorhanden, aber schwergewichtiger Stack, Agent-Ergonomie mittelmäßig. Hoch (mehrere Dienste). Scrum/Kanban, keine echte Roadmap-Timeline. Mittel. Begrenzt. Aktiv, aber Setup-/Wartungslast hoch.
GitHub Issues+Projects gh-CLI exzellent agent-freundlich; aber Repo ist self-hosted Git, kein GitHub → bräuchte einen Issues-only-Mirror in der Cloud (Datensouveränität weg, Split-Brain Code↔Issues). n/a (Cloud). Projects (Board/Timeline/Roadmap) gut. Gut. API-Import. Bruch mit Self-Host-Prinzip → nicht empfohlen (Mirror-Aufwand + Datenabfluss).

⭐ = Empfehlung.


Warum CLI / HTTP-API > MCP für diesen Zweck

Dennis' Präferenz „etwas Besseres als MCP" ist hier technisch gut begründet — gerade für ein Zwei-Sessions-Agenten-Setup, das ohnehin schon auf curl-Endpoints (Agent-Bus) baut:

  1. Determinismus & Reproduzierbarkeit. Ein curl … -X PATCH … -d '{"state":…}' ist ein exakt protokollierbarer, wiederholbarer Aufruf — copy-paste-bar in Skripte, Cron, Skills. MCP-Tool-Calls sind serverseitig vermittelt und je nach Server-Version/Tool-Schema wechselhaft.
  2. Kein MCP-Server-Lifecycle. MCP heißt: ein weiterer Prozess, den man starten, beobachten, neu starten und versionieren muss — pro Session. Beide Sessions (MacClaude über WireGuard, StratoClaude lokal) sprechen dagegen schon heute direkt HTTP gegen den VPS (/api/bus*). Ein PM-Endpoint reiht sich nahtlos ein, null neue Laufzeit.
  3. Skriptbarkeit & Komposition. curl | jq lässt sich frei mit Bash, dem /groom-Skill und app/bus.sh verketten (z. B. „alle offenen MacClaude-Tickets → Bus-Nachricht"). MCP-Tools komponieren nicht über die Shell.
  4. Debugbarkeit. Fehlersuche an einem HTTP-Call ist transparent (Statuscode, JSON-Body, -v). MCP fügt eine Indirektion (Tool-Layer + Transport) ein, die im Fehlerfall verschleiert.
  5. Token-/Kontext-Ökonomie. Ein dünner pm.sh-Wrapper (analog linearis' discover-then-act: wenige Subcommands, JSON-Out) hält die genutzte Oberfläche klein — statt ein fettes MCP-Tool-Schema in jeden Kontext zu laden. Das passt zur Compact-Disziplin des Projekts.
  6. Least-Privilege-Auth wie beim Bus. Plane-X-API-Key (bzw. Vikunja-JWT) ist ein scoped Token in der .env — dasselbe Muster wie BUS_TOKEN/INTERNAL_API_TOKEN. Kein neues Auth-Modell.

MCP ist nicht falsch — Plane/Linear/GitLab haben MCP-Server. Aber für agentische Pflege in diesem self-hosted, skript-getriebenen Setup ist die HTTP-API der robustere, billigere, determinischere Draht. Die MCP-Option bleibt als Bonus erhalten, falls je gewünscht.


Migrationsskizze: Markdown-Backlog → Tickets

Der bestehende Backlog ist bereits stark strukturiert (Tabelle mit ID·Titel·Bereich·WAF· Aufwand·Prio·Status·Ref) — das mappt fast 1:1 auf Plane-Felder.

Feld-Mapping (B-NN-Tabelle → Plane-Work-Item):

Markdown-Spalte Plane-Ziel Anmerkung
B-NN (ID) Custom Property backlog_id (Text) Stabil halten — Plane vergibt eigene laufende Nummer; B-NN als unveränderliches Custom Field führen (für Refs in Code/Docs/Bus).
Titel name direkt.
Bereich (Küche/Capture/…) Label als farbige Labels anlegen.
WAF / Aufwand Custom Properties (waf, aufwand) „–" = leer; nie erfinden (Groom-Regel bleibt).
Prio priority bleibt leer / Dennis' Hoheit KI setzt nie Prio.
Status (offen/in Arbeit/vertagt/erledigt/verworfen) State-Workflow 5 States anlegen, Gruppen: backlog/unstarted/started/completed/cancelled. „verworfen"→cancelled (⛔ bleibt sichtbar, kehrt nicht als „offen" zurück).
Ref (#NN, ADR, §-Anker, Handoff-Nr) Beschreibung + Kommentare + Links ADR-/§-Refs in die Description; Verlauf als Kommentare.
Owner (neu!) Custom Property owner = MacClaude/StratoClaude macht die Zwei-Sessions-Trennung explizit (heute nur implizit über „Bereich: Backend").
Welle/Phase (neu!) Custom Property welle (z. B. W4, phase-5) ersetzt die verstreuten Wellen-Notizen.

Now/Next/Later (ROADMAP.md): als Module oder Custom Property bucket abbilden — Dennis pflegt sie weiter, der visuelle Timeline-View ersetzt die handgeschriebene Erzählung. „Bewusst vertagt (+Warum)" → State vertagt + Kommentar mit Begründung.

Bulk-Import-Ansatz: Einmaliges Python-Skript (backend-Stil, requests/curl): Markdown-Tabelle parsen → je Zeile POST …/work-items/ + Custom-Property-Values setzen + backlog_id schreiben. ~60 Items → wenige Minuten. Idempotent über backlog_id (vorher GET + Abgleich), damit ein Re-Run nicht dupliziert — dasselbe Idempotenz-Prinzip wie der Bon-Import.

Was aus /groom wird: Der Skill bleibt, wandelt sich aber vom MD-Editor zum Sync-/Harvest-Skript: - Quellen-Harvest unverändert (61/62-Rekonstruktion, Handoffs, Spec-§-Tabellen, Code-TODOs). - Statt Edit auf zwei MD-Dateien: Diff gegen die Plane-Tickets (per API ziehen) → neue Items POSTen, Erledigtes per PATCH state abhaken, Refs in Description nachziehen, Dubletten per backlog_id mergen. - Eiserne Regel bleibt: Prio + Now/Next/Later = Dennis; Kurator schlägt nur vor (z. B. als Kommentar/Vorschlags-Label, nie priority setzen). - Vorteil: kein git add/pull --rebase/index.lock-Tanz mehr für Backlog-Pflege — der Commit-Lärm und das Rebase-Ping-Pong (genau der Schmerz, der schon zum Agent-Bus führte) entfallen für Backlog/Roadmap komplett. Git bleibt nur für echten Code.


Self-Host-/Deploy-Skizze (Plane)

Stack: Plane liefert ein Docker-Compose-Bundle (~13 Services: API, Web, Worker/Beat, Postgres, Redis/Valkey, MinIO, interner Proxy). Footprint: 4 GB RAM min., 8 GB empfohlen — das ist der größte Posten dieser Entscheidung und auf dem geteilten VPS einzuplanen.

Traefik-Anbindung (Muster wie der restliche Stack): - Eigene Subdomain pm.dennisfisch.de, Let's-Encrypt via vorhandenem Cloudflare-DNS-01. - Plane-internen Proxy hinter Traefik hängen; Container-Ports nur auf 127.0.0.1 + WireGuard (MacClaude erreicht die API über den bekannten WG-Fallback, analog Bus). - Postgres/MinIO nicht öffentlich; Plane-Data in die bestehende Backup-Rotation aufnehmen (Postgres-Dump + MinIO; Valkey braucht kein Backup).

SSO: Plane unterstützt OIDC — die Pocket ID (id.silverscale.dennisfisch.de) kann als OIDC-Provider andocken, dann ein Login für App + PM. Für die Agenten ist SSO irrelevant: sie nutzen den X-API-Key-Token (scoped, in der Repo-.env, niemals committen — gleiche Regel wie LIDL_REFRESH_TOKEN/Bus-Token).

Aufwand (grob): - Compose hochziehen + Traefik-Labels + Subdomain: ~0,5 Tag. - States/Labels/Custom-Properties anlegen + API-Token: ~0,5 Tag. - Bulk-Import-Skript (MD→Tickets, idempotent): ~0,5–1 Tag. - /groom zum Sync-Skript umbauen + pm.sh-Wrapper: ~1 Tag. - Summe ~2,5–3 Tage, danach läuft die Backlog-Pflege agentisch.

Risiken / Stolperfallen: - RAM-Druck auf dem geteilten VPS — Plane ist das Schwergewicht; vorher Speicher prüfen. (Vikunja als Sparvariante mit ~1 Go-Binary, falls der VPS eng wird.) - Migrations-/Upgrade-Disziplin bei einem 13-Container-Open-Core-Stack: Updates testen, Backups vor Major-Upgrades. Self-hosted Plane hinkt der Cloud bei einzelnen API-Features teils hinterher (z. B. waren Pages-Endpoints zeitweise nicht im self-hosted REST exponiert — vor Verlass auf ein Feature kurz gegen die laufende Instanz testen). - Webhooks zu Private-IPs: self-hosted Plane verlangt für Webhook-Targets erreichbare, nicht-localhost-URLs — falls man Plane→Bus-Webhooks will, über die WG-/interne IP planen. - Zwei Wahrheiten vermeiden: Während der Migration NICHT parallel MD und Tickets pflegen. Cut-over planen; MD-Dateien danach als „eingefroren, siehe Plane" markieren (oder das Import-Skript bleibt als Re-Hydration-Pfad). - backlog_id-Stabilität: Plane-Item-IDs ≠ B-NN. Alle Code-/Doc-/Bus-Referenzen auf B-NN müssen weiter über das Custom Field auflösbar bleiben.


Quellen (Abruf 2026-06-10)


Recherche-Stand 2026-06-10. Empfehlung: Plane self-hosted, von den Agenten per curl/REST bedient (kein MCP-Lifecycle), /groom als Sync-Skript. Prio + Now/Next/Later bleiben Dennis' Hoheit. Footprint (Plane ~8 GB RAM) ist der entscheidende Trade-off gegen die leichtere Vikunja-Alternative.