Files
Deploymentcenter/docs/ROADMAP.md
T
Deploymentcenter BotandClaude Opus 5 93aabfece3 feat(agenten): Vorlage in vier Bausteine, Anbindungsanleitung, Tooltips (#75)
VORLAGE ZERLEGT

docs/AGENT_PROMPT_TEMPLATE.md war ein Block von 300 Zeilen, den jedes Projekt
vollstaendig einkopierte - auch die, in denen der MCP-Adapter laeuft und die
Werkzeuge ihre Beschreibung selbst mitbringen. Jetzt vier Bausteine:

  A  Grundhaltung, gilt immer. Vier Regeln, kurz.
  B  Mit MCP-Adapter: die Reihenfolge, die in keiner Werkzeugbeschreibung
     steht - erst nachsehen, dann uebernehmen, dann arbeiten.
  C  Ohne MCP: der REST-Weg, vollstaendig. Nur wo kein Adapter laeuft.
  D  Auf der Test-VM.

Ein Projekt mit Adapter traegt damit eine halbe Seite statt zweihundert Zeilen,
die das Modell nie liest und die auseinanderlaufen, sobald sich die
Schnittstelle aendert. Loest #75 (vormals C4).

NEU: docs/AGENTEN_ANBINDEN.md

Was einmalig je Projekt zu tun ist - fuer den Menschen, nicht fuer den Agenten:
Werkbank-Token, Adapter, welche Bausteine, Roadmap-Uebernahme, Test-VM. Dazu
zwei Abschnitte, die sonst gefehlt haetten:

  - Was NICHT an die anderen Projekte geht: Testinstanz und tests/e2e gehoeren
    zum Deploymentcenter und werden nicht je Projekt nachgebaut. Uebernehmen
    laesst sich die Haltung dahinter - Befund bekommt Item UND Testfall,
    bekannte Befunde blockieren nicht, fehlende Voraussetzung heisst
    uebersprungen und nicht rot.
  - Vier Pruefragen an den Agenten nach der Einrichtung. Antwortet er auf
    "was steht als Naechstes an" mit dem Inhalt einer Markdown-Datei, fehlt
    Baustein A oder der Adapter laeuft nicht.

WEBUI

Die Spaltenkoepfe der Bereichsuebersicht waren Zeichen ohne Erklaerung - wer
die Legende nicht gelesen hat, und das ist der Normalfall, riet was 🧊 heisst.
Jetzt title= samt Fragezeichen-Zeiger und gepunkteter Linie, damit ueberhaupt
erkennbar ist, dass da etwas zu holen ist. Auch Rang, Item, Ziel, Wer und Doku
in der Vorhabenliste, und der Fortschritt mit dem Hinweis, warum
Zurueckgestelltes und Verworfenes nicht in den Nenner zaehlt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-30 13:25:45 +02:00

672 lines
33 KiB
Markdown
Raw 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.
# Roadmap
Die BegrĂŒndungen zu allem Geplanten, ZurĂŒckgestellten und bewusst Verworfenen.
**Der Zustand steht nicht hier, sondern im Deploymentcenter** — WebUI → Roadmap,
oder `dc_roadmap` ĂŒber den MCP-Adapter. Was unten zwischen den
`<!-- dc:roadmap -->`-Markern steht, ist eine **erzeugte Kopie**: `php
cli/roadmap.php --write` schreibt sie, und beim nÀchsten Lauf wird sie
ĂŒberschrieben. Von Hand dort nichts Ă€ndern.
Alles außerhalb der Marker ist von Hand geschrieben und bleibt unberĂŒhrt. Das
ist der Teil, der eine Tabellenzelle nicht ĂŒberlebt: warum etwas so entschieden
wurde, woran man erkennt, dass ein ZurĂŒckgestelltes wieder ansteht, und warum
ein Verworfenes verworfen bleibt.
Bis 2.6.0 lagen diese Angaben ĂŒber mehrere Entwurfsdokumente verstreut, bis
2.7.0 standen Zustand und BegrĂŒndung nebeneinander in dieser Datei — beides mit
derselben Folge: Ein Punkt galt als offen, obwohl der Code ihn lÀngst erledigt
hatte. Seither hat kein Feld zwei Pfleger.
Die abgelösten EntwĂŒrfe liegen unter [archiv/](./archiv/) — sie enthalten die
ausfĂŒhrliche BegrĂŒndung, aber keinen gĂŒltigen Stand mehr.
---
## Status-Kennzeichnung
| | Bedeutung |
|---|---|
| ✅ | Erledigt und ausgeliefert |
| 🔹 | In Arbeit |
| 📋 | Geplant, als NĂ€chstes dran |
| 🧊 | **ZurĂŒckgestellt** — bewusst nicht jetzt, Auslöser genannt |
| ❌ | **Verworfen** — mit BegrĂŒndung, nicht erneut vorschlagen |
| ⚙ | Betriebsaufgabe, kein Code |
---
<!-- dc:roadmap stand=2026-08-30T11:25Z items=61 projekt=deploymentcenter -->
<!-- ERZEUGT - nicht von Hand aendern. Dieser Block wird bei jedem Lauf von
`php cli/roadmap.php --write` ueberschrieben. Der Zustand wird im
Deploymentcenter gepflegt, nicht hier. Prosa gehoert AUSSERHALB der
Marker - dort bleibt sie unberuehrt. -->
### Als Naechstes
1. **[B] #69 — Befunde im WebUI: Liste, Filter nach Detektor, Einstufen**
2. **[G] #93 — dc-testkit supervisor — prĂŒfen, ob eine Anbindung wirklich meldet**
3. **[G] #96 — Testartefakt oder echter Befund? — die offene Frage**
4. **[A] #65 — Symbol-Upload und dc_symbolicate**
### A — Supervisor und Befunde
| | Vorhaben | Stand | Ziel |
|---|---|---|---|
| #65 | Symbol-Upload und dc_symbolicate | 📋 Offen | — |
| #62 | Detektor-Katalog mit stabilen Namen (Modules/Supervisor/Catalog.php) | ✅ Erledigt | `2.6.0` |
| #63 | FĂŒnf serverseitige Detektoren im Tick: novel.error_signature, silence.heartbeat, deviation.self, deviation.fleet, reg... | ✅ Erledigt | `2.6.0` |
| #64 | Supervisor-Client fĂŒr .NET und PHP | ❌ Verworfen | — |
| #66 | novel.log_template — Logzeilen-Schablonen, die noch nie auftraten | 🧊 Zurueckgestellt — Ausloeser: sobald LogauszĂŒge strukturiert hereinkommen. Heute liefert nichts sie in einer Form, aus der sich Schablonen bilden l... | — |
| #67 | LĂ€ngsschnitt fĂŒr regression.build | 🧊 Zurueckgestellt — Ausloeser: wenn Fehlzuordnungen auffallen. Nötig wĂ€re eine Historie der app_version je Monitor; das Feld wird heute ĂŒberschrieben. | — |
| #68 | Schwellen der serverseitigen Detektoren an echten Daten nachprĂŒfen | 📋 Offen | — |
### B — Oberflaeche
| | Vorhaben | Stand | Ziel |
|---|---|---|---|
| #69 | Befunde im WebUI: Liste, Filter nach Detektor, Einstufen | 📋 Offen | — |
| #70 | Fremdmeldungen sichtbar (triage_external in Filter, Abzeichen, Bearbeiten) | ✅ Erledigt | `2.6.0` |
| #71 | Monitoren ein Projekt zuweisen | 📋 Offen | — |
### C — Projektlandschaft
| | Vorhaben | Stand | Ziel |
|---|---|---|---|
| #72 | ProjektĂŒbergreifend melden (dev_agent, evidence, triage_external, affects) | ✅ Erledigt | `2.6.0` |
| #73 | Beziehungen zwischen Projekten (dc_project_links, integrated_version) | ✅ Erledigt | `2.6.0` |
| #74 | RĂŒckkanal: „was du gemeldet hast, ist behoben" | ✅ Erledigt | `2.6.1` |
| #75 | Agent-Prompt-Vorlage in den Projekten durch MCP ablösen | ✅ Erledigt | `2.7.0` |
### D — Werkzeuganbindung (MCP)
| | Vorhaben | Stand | Ziel |
|---|---|---|---|
| #76 | stdio-Adapter ohne FremdabhĂ€ngigkeiten | ✅ Erledigt | `2.6.0` |
| #77 | Fremddaten im Werkzeugergebnis abgegrenzt kennzeichnen | ✅ Erledigt | `2.6.0` |
| #78 | Abgleich: Werkzeugliste gegen openapi.php | 📋 Offen | — |
| #79 | Entfernter MCP-Server unter /mcp mit OAuth | 🧊 Zurueckgestellt — Ausloeser: wenn mehrere Maschinen oder Personen dranhĂ€ngen. Dann aber mit OAuth statt Bearer-Token in einer Konfigurationsdatei ... | — |
| #80 | dc_roadmap und dc_roadmap_set — Planungsstand als Werkzeug | ✅ Erledigt | `2.7.0` |
### E — Betrieb
| | Vorhaben | Stand | Ziel |
|---|---|---|---|
| #81 | Migrationen 013 und 014 auf dem Server ausfĂŒhren | ✅ Erledigt | `2.7.0` |
| #82 | PHP-Seite prĂŒfen — die Testinstanz tut das jetzt bei jedem Deployment | ✅ Erledigt | `2.7.0` |
| #83 | Monitoren ein Projekt zuordnen (watchdog_monitors.project_slug) | 📋 Offen | — |
| #84 | Je Projekt ein Werkbank-Token (dev_agent) anlegen | 📋 Offen | — |
| #85 | Supervisor-Vorbereitungen in den Projekten zurĂŒckbauen | 📋 Offen | — |
### F — Quelltext-Zugriff
| | Vorhaben | Stand | Ziel |
|---|---|---|---|
| #86 | Stufe 0 — Diagnose-Agent lĂ€uft auf eigener Maschine mit lokalem Checkout | ✅ Erledigt | — |
| #87 | Stufe 1 — Quelltext-Index im DC, nur Ausschnitte | 🧊 Zurueckgestellt — Ausloeser: wenn ein Agent autonom rund um die Uhr laufen soll, ohne dass eine eigene Maschine lĂ€uft. Solange Claude Code den Che... | — |
| #88 | Stufe 2 — nur Metadaten: Signaturen, Aufrufgraph, keine RĂŒmpfe | 🧊 Zurueckgestellt — Ausloeser: falls selbst Ausschnitte zu viel sind. Signaturen, Aufrufgraph und Doc-Kommentare ohne Methodenkörper reichen zur Tri... | — |
### G — Testumgebung
| | Vorhaben | Stand | Ziel |
|---|---|---|---|
| #93 | dc-testkit supervisor — prĂŒfen, ob eine Anbindung wirklich meldet | 📋 Offen | — |
| #96 | Testartefakt oder echter Befund? — die offene Frage | 📋 Offen | — |
| #89 | Kopfloser Installationsmodus fuer den update-agent | 📋 Offen | — |
| #90 | DEV-Lizenzschluessel zur Selbstbedienung (POST /api/license/v1/dev-key, Scope license:dev) | ✅ Erledigt | `2.6.1` |
| #91 | dc-testkit — ein Weg fuer Lizenz, Auslieferung und Meldung | ✅ Erledigt | `2.6.1` |
| #92 | Werkbank-Token je Projekt auf der Test-VM hinterlegen | 📋 Offen | — |
| #94 | Test-Monitore aus dem Flottenvergleich heraushalten | 📋 Offen | — |
| #95 | Befunde tragen die Umgebung, ausserhalb production eine Stufe niedriger | ✅ Erledigt | `2.6.1` |
| #97 | Nachpruefung als Arbeitsschlange (awaiting_verification, in_verification, fix_insufficient) | ✅ Erledigt | `2.6.1` |
| #98 | Auswertung ĂŒber meta_json: wie oft fĂ€llt ein Fix durch die PrĂŒfung? | 🧊 Zurueckgestellt — Ausloeser: wenn die Frage „wie oft trĂ€gt ein Fix nicht?" tatsĂ€chlich gestellt wird. Seit 2.6.1 schreibt jeder Statuswechsel stru... | — |
### I — Roadmap im Deploymentcenter
| | Vorhaben | Stand | Ziel |
|---|---|---|---|
| #107 | Diese Datei selbst ĂŒbernehmen — EintrĂ€ge A1–H als Items anlegen, Kennungen auf Item-IDs umstellen | ✅ Erledigt | `2.7.0` |
| #99 | Migration 016: epic, roadmap_rank, target_build, defer_trigger, doc_anchor, Status deferred, Tabelle roadmap_epics | ✅ Erledigt | `2.7.0` |
| #100 | Modules/Bugtracker/Roadmap.php — Sicht, Reihenfolge, Erzeugung, Abgleich | ✅ Erledigt | `2.7.0` |
| #101 | /api/bugtracker/v1/roadmap.php — list, epics, next, active, render, check, set, move, reorder, epic | ✅ Erledigt | `2.7.0` |
| #102 | WebUI-Modul Roadmap: Übersicht, Liste, Aufnahmeliste, Themenbereiche | ✅ Erledigt | `2.7.0` |
| #103 | cli/roadmap.php --write/--check/--list | ✅ Erledigt | `2.7.0` |
| #104 | dc_roadmap, dc_roadmap_set im MCP-Adapter | ✅ Erledigt | `2.7.0` |
| #105 | Übernahmeleitfaden fĂŒr die anderen Projekte | ✅ Erledigt | `2.7.0` |
| #106 | Migration 016 auf dem Server ausfĂŒhren | ✅ Erledigt | `2.7.0` |
| #108 | Die anderen Projekte ĂŒbernehmen (myapp, polytrader, predictalytics) | 📋 Offen | — |
| #109 | --check in scripts/deploy.py einhĂ€ngen | 📋 Offen | — |
| #110 | Auswertung: wie lange steht ein Vorhaben in welcher Lage? | 🧊 Zurueckgestellt — Ausloeser: wenn die Frage „warum dauert das so lange?" tatsĂ€chlich gestellt wird. status_changed_at und das strukturierte meta_j... | — |
### H — Verworfen
| | Vorhaben | Stand | Ziel |
|---|---|---|---|
| #111 | Supervisor-Beobachter im ausgelieferten Programm (auch regelbasiert, ohne Sprachmodell) | ❌ Verworfen | — |
| #112 | Sprachmodell-Supervisor auf der Kundenmaschine | ❌ Verworfen | — |
| #113 | Quelltext mit dem Client ausliefern, auch verschlĂŒsselt | ❌ Verworfen | — |
| #114 | Deploy-Key oder Repo-Token im Client | ❌ Verworfen | — |
| #115 | Obfuskation als Schutz einplanen | ❌ Verworfen | — |
| #116 | MCP-Werkzeuge 1:1 aus OpenAPI erzeugen | ❌ Verworfen | — |
| #117 | publish, provision, deactivate als MCP-Werkzeug | ❌ Verworfen | — |
| #118 | Befunde puffern, wenn das DC ausfĂ€llt | ❌ Verworfen | — |
| #119 | Benachrichtigung je Befund | ❌ Verworfen | — |
| #120 | Lokale Befund-OberflĂ€che in den Anwendungen | ❌ Verworfen | — |
| #121 | enforceProject() pauschal fĂŒr dev_agent öffnen | ❌ Verworfen | — |
| #122 | Feste Schwellwerte je Kennzahl als Hauptweg | ❌ Verworfen | — |
<!-- /dc:roadmap -->
---
## BegrĂŒndungen
Ab hier von Hand. Jede Überschrift trĂ€gt die Item-Nummer, unter der das
Vorhaben im Deploymentcenter steht.
## A — Supervisor und Befunde
Der Supervisor beantwortet die Frage „ist das ungewöhnlich?". Die Frage „ist
das schlimm?" beantwortet das Deploymentcenter, wo Verlauf, Flotte und
Quelltext bekannt sind. Diese Trennung ist die Grundentscheidung des ganzen
Entwurfs — siehe [archiv/SUPERVISOR_MCP_DESIGN.md](./archiv/SUPERVISOR_MCP_DESIGN.md),
Abschnitt 0.
> **Der Supervisor lebt nur noch auf der Serverseite.** Ein Beobachter im
> ausgelieferten Programm ist verworfen (H) — er hĂ€tte zu viele Baustellen
> aufgemacht und wÀre den Mehraufwand nicht wert gewesen. Was bleibt:
>
> - die **serverseitigen Detektoren**, die auf ohnehin eingehenden Daten
> arbeiten und nichts in den Anwendungen brauchen
> - der Eingang `POST /api/supervisor/v1/observe` fĂŒr alles, was von außen
> meldet — heute PrĂŒfwerkzeuge und TestlĂ€ufe
> - der **Katalog** als gemeinsame Sprache fĂŒr Befundnamen
>
> Der Zweck, den ein Client-Beobachter erfĂŒllt hĂ€tte, ist bei
> **Error-Reporting und Bugtracker** besser aufgehoben. Die werden
> weiterentwickelt.
### [A] #65 — Symbol-Upload und `dc_symbolicate`
Der Packager lĂ€dt beim `publish` die PDB bzw. Sourcemap mit hoch, verknĂŒpft mit
`commit_sha`. Ausgeliefert wird ein gestripptes Binary. Der Kunde bekommt
`at 0x4a2f`, du bekommst `UserAuthService.cs:42`.
Der Gewinn: Berichte werden so gut wie mit einem Debug-Build, **ohne dass
Quelltext das Haus verlĂ€sst**. Das ist der Hebel, der den grĂ¶ĂŸten Nutzen pro
Aufwand bringt — und die Voraussetzung dafĂŒr, dass ein Diagnose-Agent mit einer
Fehlermeldung ĂŒberhaupt etwas anfangen kann.
Betroffen: `client-dotnet/Deploymentcenter.Packager`, ein Ablageort fĂŒr
Symboldateien, `dc_symbolicate` im MCP-Adapter.
### [A] #66 — `novel.log_template`
**Auslöser:** sobald LogauszĂŒge strukturiert hereinkommen. Heute liefert nichts
sie in einer Form, aus der sich Schablonen bilden ließen.
### [A] #67 — LĂ€ngsschnitt fĂŒr `regression.build`
`regression.build` vergleicht heute die beiden höchsten Fassungen im Feld im
**Querschnitt** — verschiedene Maschinen zur selben Zeit, nicht dieselbe
Maschine vor und nach dem Update. Bei gemischten Kohorten kann ein Unterschied
deshalb auch von der Maschine kommen statt von der Fassung.
**Auslöser:** wenn Fehlzuordnungen auffallen. Nötig wÀre eine Historie der
`app_version` je Monitor; das Feld wird heute ĂŒberschrieben.
### [A] #68 — Schwellen nachprĂŒfen
Die serverseitigen Detektoren rechnen mit gesetzten, aber nirgends
nachgeprĂŒften Werten: `SIGMA = 3.0` fĂŒr `deviation.self` und `deviation.fleet`,
`MIN_COHORT = 5`, `REGRESSION_RATIO = 1.25`, `NOVEL_WINDOW_MIN = 120` — alle in
`ServerDetectors`.
Beurteilbar erst, wenn eine Weile echte Daten durchgelaufen sind. Die Frage
lautet fĂŒr jeden Wert gleich: Wie viele der erzeugten Befunde hat jemand als
brauchbar eingestuft? Der Status `ignored` an den Befunden beantwortet das von
selbst, sobald gesichtet wird.
---
### [A] #64 — Supervisor-Client fĂŒr .NET und PHP
Verworfen. Die BegrĂŒndung steht in Abschnitt H, beim Beobachter im
ausgelieferten Programm — dieser Client wĂ€re sein Einbauteil gewesen und fĂ€llt
mit ihm weg.
---
## B — OberflĂ€che
### [B] #69 — Befunde im WebUI
Befunde sind heute nur ĂŒber `/api/supervisor/v1/findings` und die MCP-Werkzeuge
erreichbar. FĂŒr die Sichtung durch einen Menschen fehlt die Ansicht — und damit
auch der einzige Weg, `supervisor:manage` sinnvoll zu nutzen.
Gebraucht wird: ZĂ€hlung je Detektor als Einstieg, dahinter die Einzelbefunde
mit `observed`/`baseline`, und die Statuswechsel (`acknowledged`, `promoted`,
`resolved`, `ignored`). Beim Übernehmen in ein Bugtracker-Item die VerknĂŒpfung
ĂŒber `supervisor_findings.bug_item_id` setzen — die Spalte gibt es bereits.
### [B] #71 — Monitoren ein Projekt zuweisen
`watchdog_monitors.project_slug` wird administrativ gesetzt, nicht vom Agenten
gemeldet. DafĂŒr fehlt das Bedienelement in der Monitor-Verwaltung. Bis dahin
nur per SQL — siehe #81.
---
## C — Projektlandschaft
### [C] #74 — RĂŒckkanal
Wird ein Item behoben, das ein anderes Projekt gemeldet hat, erfÀhrt dieses
Projekt heute nichts davon. Folge: Es meldet denselben Punkt in drei Monaten
erneut und baut seinen Workaround nie zurĂŒck.
`GET /api/updateservice/v1/changelog?since=
` liefert bereits `action_items`.
Zu ergĂ€nzen ist der Abgleich ĂŒber `bugtracker_item_affects`: „Das Item, das du
gemeldet hast, ist in 2.7.0 erledigt."
Das schließt den Kreis, den #72 geöffnet hat. Ohne ihn ist der Meldeweg ein
Briefkasten ohne Leerung.
**Gelöst in 2.6.1 — aber anders als hier ursprĂŒnglich gedacht.** Der Entwurf
sah eine Benachrichtigung vor. Gebaut wurde stattdessen eine Arbeitsschlange,
und das ist die bessere Antwort auf dieselbe Frage:
- **Passiv:** Wer erneut meldet, bekommt die Auskunft von selbst. Der
Report-Endpunkt vergleicht `build_version` gegen `resolved_in_build` und
antwortet mit `known_fixed_in`, statt ein Regressionsitem anzulegen.
- **Aktiv:** Ein veröffentlichter Fix stellt sein Item auf
`awaiting_verification`. Damit steht es in `?action=next` — auch beim
meldenden Fremdprojekt, ĂŒber `bugtracker_item_affects`. Der Melder wird also
gefragt, ob der Fix bei ihm wirkt.
**Warum keine Zustellstrecke.** Agenten fragen ohnehin nach Arbeit. Ein Status,
der in der Warteschlangenabfrage vorkommt, *ist* die Zustellung — ohne
Speicher, ohne Entstörung, ohne Quittungen. Der Workaround-Fall, der die ganze
Diskussion trug, ist damit erledigt: Er brauchte keinen Push, sondern einen
Anlass, noch einmal hinzusehen.
Was bleibt: Wer einen Workaround gebaut hat, muss den PrĂŒfauftrag auch
annehmen. Nimmt ihn niemand an, wird nach 30 Tagen ungeprĂŒft geschlossen — mit
einem Vermerk, der das ausdrĂŒcklich sagt.
### [C] #75 — Prompt-Vorlage entlasten
[AGENT_PROMPT_TEMPLATE.md](./AGENT_PROMPT_TEMPLATE.md) ist in jedes Projekt
einkopiert, samt der von Hand gepflegten Versionszeile.
**Der Zuschnitt hat sich mit 2.6.1 geĂ€ndert.** UrsprĂŒnglich stand hier
„durch MCP ablösen". Inzwischen gibt es drei Wege zum Deploymentcenter, und
keiner löst die anderen ab:
| Wo der Agent arbeitet | Weg | Was er braucht |
|---|---|---|
| Projektverzeichnis mit `.mcp.json` | MCP-Adapter | keine Vorlage |
| Linux-Test-VM | `dc-testkit` | Kurzfassung, kein `curl` |
| alles Übrige | REST direkt | die volle Vorlage |
Die Vorlage bleibt also — sie ist der RĂŒckfallweg und beschreibt zugleich, was
`dc-testkit` tut. Zu tun ist trotzdem etwas: In Projekten **mit** eingerichtetem
Adapter kann sie auf die Kurzfassung schrumpfen, und die handgepflegte
Versionszeile ersetzt in allen FĂ€llen `dc_link_project`.
Das ist der Punkt, an dem es sich lohnt, die Vorlage in drei Bausteine zu
zerlegen statt in einen Block: Grundlagen, „mit MCP", „auf der Test-VM". Heute
trÀgt jedes Projekt alles mit.
---
## D — Werkzeuganbindung (MCP)
### [D] #78 — Abgleich Werkzeugliste ↔ OpenAPI
Adapter und OpenAPI beschreiben dieselben Endpunkte. Ohne Abgleich laufen sie
auseinander, und es fÀllt erst auf, wenn ein Werkzeug ins Leere greift.
Das Projekt hat **keine CI-Strecke**. Als Erstes reicht deshalb ein Skript, das
von Hand oder aus `deploy.py` heraus lÀuft. Eine echte Pipeline wÀre ein
eigenes Vorhaben und lohnt erst, wenn es mehr zu prĂŒfen gibt als diese eine
Zusage.
### [D] #79 — Entfernter Server
**Auslöser:** wenn mehrere Maschinen oder Personen dranhÀngen. Dann aber mit
OAuth statt Bearer-Token in einer Konfigurationsdatei — sonst liegt dasselbe
Token auf jeder Maschine. Solange der stdio-Adapter je Projekt reicht, lohnt
der Aufwand nicht.
---
## E — Betrieb
Kein Code, aber Voraussetzung dafĂŒr, dass Gebautes wirkt.
**#83 ist Voraussetzung fĂŒr `deviation.fleet` und `regression.build`.** Ohne
Zuordnung ĂŒberspringen beide Detektoren die betroffenen Monitore; die ĂŒbrigen
drei laufen weiter.
**#84 vor #85.** Ohne Werkbank-Token laufen `dc_link_project` und `dc_report` aus
den Projekten heraus ins Leere.
**#82 gehört auf die Test-VM.** Die gesamte PHP-Seite von 2.6.0 — Migrationen
013 und 014, der Supervisor-Endpunkt, das projektĂŒbergreifende Melden — wurde
auf einer Maschine ohne PHP geschrieben. Weder Lint noch ein Lauf haben sie je
gesehen. Seit 2.6.1 gibt es die geteilte Test-VM (Abschnitt G); dort gehört das
geprĂŒft, bevor es auf den Produktivserver geht. Mindestens:
```bash
find src public cli -name '*.php' -print0 | xargs -0 -n1 php -l
php cli/migrate.php
php cli/tick.php # ohne --quiet: zeigt den Detektorlauf
```
**#85 ist reiner RĂŒckbau geworden.** In mehreren Projekten wurden
Vorbereitungen fĂŒr einen lokalen Supervisor begonnen — UI-Steuerelemente,
teilweise ein KI-Agent. Da der Client-Supervisor verworfen ist (H), fÀllt das
ersatzlos weg; nichts tritt an seine Stelle. Was an den Vorbereitungen wertvoll
ist, ist die Überlegung, **worauf** zu achten wĂ€re — die gehört als PrĂŒfung in
die TestlÀufe oder als Fehlermeldung in den Bugtracker, nicht in ein
Beobachterteil.
Der Auftrag zum EinfĂŒgen steht in
[SUPERVISOR_INTEGRATION_GUIDE.md](./SUPERVISOR_INTEGRATION_GUIDE.md).
---
## F — Quelltext-Zugriff fĂŒr die Diagnose
Die Software bleibt geschlossen. Es gibt keine öffentliche Stelle, an der
Quelltext zu sehen ist. Drei Stufen, in aufsteigender Preisgabe:
### [F] #87 — Quelltext-Index Stufe 1
**Auslöser:** wenn ein Agent autonom rund um die Uhr laufen soll, ohne dass
eine eigene Maschine lÀuft. Solange Claude Code den Checkout ohnehin lokal hat,
wÀre das zusÀtzliche AngriffsflÀche ohne Gegenwert.
Falls es kommt, dann als Schnittstelle, die **nie ein Ganzes herausgibt**:
```
GET /api/source/v1/snippet?commit=a21536f&file=
&line=42&context=40
GET /api/source/v1/search?q=
&limit=20
```
Neuer Scope `source:read`, nie an Client-Token, verschlĂŒsselt abgelegt, Budget
je Token und Tag, jeder Abruf im PrĂŒfprotokoll. Der Unterschied zwischen „darf
nachschlagen" und „darf mitnehmen".
### [F] #88 — Stufe 2
**Auslöser:** falls selbst Ausschnitte zu viel sind. Signaturen, Aufrufgraph
und Doc-Kommentare ohne Methodenkörper reichen zur Triage, aber nicht zum
Nachbauen.
---
## G — Testumgebung und Selbstbedienung
Die geteilte Linux-Test-VM. Anleitung: **[TESTUMGEBUNG.md](./TESTUMGEBUNG.md)** — dort
steht auch, was auf der Maschine belegt ist.
### [G] #89 — Kopfloser Installationsmodus
`update-agent --action install` ist ein Dialog mit Auswahllisten und Passwortabfrage. Ein
Agent kann ihn nicht treiben: Auswahllisten brauchen Pfeiltasten an einem echten Terminal,
und ein Agent darf grundsaetzlich kein Passwort eingeben.
Folge: `dc-testkit install` prueft die **Auslieferung** in ein leeres Verzeichnis — denselben
Pfad, den der Installer intern nimmt, mit Download, SHA256, Signatur, Staging und Rollback.
Ungeprueft bleiben damit die Aufloesung von `setup.json` und das Schreiben der Konfiguration.
Das ist genau der Teil, der je Anwendung anders aussieht und deshalb am ehesten bricht.
Gebraucht wird `--action install --answers antworten.json`: dieselben Felder, die der Dialog
erfragt, aus einer Datei. Fehlt ein Pflichtfeld, bricht der Lauf ab, statt zu fragen. Das
Installationskonto bliebe dabei aussen vor — mit einem DEV-Lizenzschluessel kommt der Agent
ohnehin an die Release-Ablage.
Betroffen: `client-dotnet/Deploymentcenter.UpdateAgent/Installation.cs`.
### [G] #93 — `dc-testkit findings`
Die Nahtstelle zwischen Testumgebung und Supervisor, die heute fehlt.
Ein Testlauf erzeugt Befunde — teils durch `novel.error_signature` aus den
gemeldeten Fehlern, teils kĂŒnftig direkt ĂŒber `observe`. Sehen kann man sie von
der VM aus nicht: `dc-testkit` kennt `doctor`, `license`, `install`, `update`,
`run`, `projects` und `report`, aber nichts zum Supervisor.
Gebraucht wird wenig:
```
dc-testkit findings # was hat dieser Lauf ausgelöst?
dc-testkit findings --env all # auch das, was in production auffiel
```
Dahinter `GET /api/supervisor/v1/findings?project_slug=
`. Derselbe Zuschnitt
wie `dc_findings` im MCP-Adapter — die Abfrage existiert, es fehlt nur der Weg
dorthin von der VM aus.
Das ist zugleich die Voraussetzung fĂŒr #96: Ohne Sicht auf die eigenen Befunde
kann niemand entscheiden, ob einer ein Artefakt des PrĂŒfstands war.
Das Token braucht dafĂŒr zusĂ€tzlich `supervisor:read`; heute trĂ€gt es auf der
VM nur `bugtracker:manage` und `license:dev` (§4.2 der Anleitung).
### [G] #94 — Test-Monitore aus dem Flottenvergleich
`deviation.fleet` bildet Kohorten aus (Projekt, `app_version`) und meldet, wer
daraus ausschert. `watchdog_monitors` hat **kein** Feld fĂŒr die Umgebung.
Bekommt die Test-VM einen Monitor mit demselben Projekt und derselben Fassung
wie die Produktivinstallationen, landet sie in deren Kohorte — und fĂ€llt dort
zwangslÀufig auf: andere Maschine, andere Last, andere Plattenbelegung. Das
Ergebnis wĂ€ren Befunde, die nichts ĂŒber die Software aussagen, dafĂŒr aber die
Kohortenwerte verschieben und damit echte Ausreißer verdecken.
Zwei Wege, beide vertretbar:
- ein Feld `environment` an `watchdog_monitors`, und `deviation.fleet` sowie
`regression.build` sehen nur `production` an
- oder eine Kennzeichnung ĂŒber `group_key`, ohne SchemaĂ€nderung
Solange auf der VM kein Monitor mit Produktivfassung lÀuft, ist nichts kaputt.
Es fĂ€llt nur genau dann auf, wenn es zu spĂ€t ist — deshalb hier vermerkt.
### [G] #95 — Umgebung am Befund
TestlĂ€ufe **sollen** Befunde erzeugen — ein Lauf, der einen Fehler auslöst, den
es vorher nicht gab, hat genau das getan, wofĂŒr er da ist. Die Detektoren
laufen deshalb in jeder Umgebung.
Unterschieden wird zweifach: ĂŒber `environment` am Befund, und ĂŒber den
Schweregradhinweis. Was außerhalb von `production` auffĂ€llt, ist eine Stufe
niedriger eingestuft — nicht weil es unwichtig wĂ€re, sondern weil dort
systematisch mehr Rauschen entsteht. Wer beides gleich hoch einstuft, liest
bald keines von beiden mehr.
### [G] #96 — Testartefakt oder echter Befund?
**Die eigentlich schwierige Frage.** Ein Testlauf meldet „API-Aufruf
fehlgeschlagen". Liegt das daran, dass auf der VM keine Live-Zugangsdaten
liegen — oder wĂ€re es beim Kunden genauso passiert?
VollstÀndig automatisch ist das nicht zu beantworten. Vier AnsÀtze, die
zusammen den Aufwand aber klein halten:
**1. Der PrĂŒfstand sagt, was ihm fehlt.**
Die Testumgebung weiß, was sie *nicht* hat: keine Zahlungs-API, kein echter
SMTP, DEV-Lizenz statt Kundenlizenz. Wird das einmal als Liste hinterlegt und
bei jeder Meldung mitgeschickt, lĂ€sst sich ein Befund, der eine bekannte LĂŒcke
berĂŒhrt, sofort als `environment_limited` kennzeichnen. Das ist der billigste
Schritt und nutzt Wissen, das ohnehin vorhanden und stabil ist.
**2. Die Umkehrung: nicht das Scheitern zÀhlt, sondern der Umgang damit.**
Der wichtigste Gedanke hier. Fehlende Zugangsdaten sind ein Artefakt — *wie die
Software darauf reagiert*, ist es nicht. LĂ€uft sie in eine endlose
Wiederholung? Schluckt sie den Fehler? Bleibt Zustand halb geschrieben zurĂŒck?
Landet das Passwort im Protokoll?
Das sind Produktionsbefunde, auch wenn der Auslöser kĂŒnstlich war — denn in
Produktion laufen Zugangsdaten ab, werden rotiert, fÀllt eine Gegenstelle aus.
**Der PrĂŒfstand ist damit kein Störfaktor, sondern eine billige
Fehlereinspeisung.** Ein `retry.storm`, ausgelöst durch fehlende Zugangsdaten,
ist ein echter Befund.
**3. Vergleich ĂŒber Umgebungen statt Beurteilung des Einzelfalls.**
Feuert derselbe Detektor mit demselben `subject` auch in `production`, ist die
Frage beantwortet. Feuert er ausschließlich in `development`, ist er
verdĂ€chtig. Das ist dieselbe Mechanik wie bei `deviation.fleet`, nur ĂŒber
Umgebungen statt ĂŒber Installationen — Populationen vergleichen, nicht
Einzelbefunde deuten.
**4. Einmal entscheiden, nicht jedes Mal.**
Was ĂŒbrig bleibt, entscheidet ein Mensch oder ein Agent — aber **je Signatur,
nicht je Vorkommnis**. DafĂŒr gibt es das Vorbild bereits: `IgnoreRules` im
Bugtracker (Muster, BegrĂŒndung, TrefferzĂ€hler). Ein Befund, der einmal als
Artefakt eingestuft wurde, bleibt es fĂŒr seine Signatur und zĂ€hlt trotzdem
weiter hoch — fĂ€llt er plötzlich hĂ€ufiger an, sieht man es.
Die Kosten sind damit eine Entscheidung je neuer Signatur, nicht je Lauf. Das
ist tragbar; alles darĂŒber hinaus wĂ€re RĂ€tselraten mit mehr Schritten.
**Reihenfolge:** 1 und 4 zuerst — beide klein und sofort wirksam. 3 ergibt sich
fast von selbst, sobald Befunde aus beiden Umgebungen nebeneinander liegen. 2
ist keine Umsetzung, sondern eine Lesehaltung: beim Sichten nicht fragen
„warum ist das fehlgeschlagen", sondern „wie hat sich die Software dabei
verhalten".
### [G] #98 — Auswertung der Statuswechsel
**Auslöser:** wenn die Frage „wie oft trĂ€gt ein Fix nicht?" tatsĂ€chlich gestellt
wird. Seit 2.6.1 schreibt jeder Statuswechsel strukturiertes `meta_json`
(`from`, `to`, `actor`, `since`) in `bugtracker_comments`. Damit lassen sich
Verweildauern und DurchlÀufe auswerten, **ohne** eine Historientabelle daneben.
Eine eigene Tabelle verdient sich erst bei Fragen ĂŒber Items hinweg — Median der
PrĂŒfdauer, Quote durchgefallener Fixes je Projekt. Vorher wĂ€re sie eine zweite
Wahrheit ĂŒber denselben Vorgang.
### [G] #92 — Werkbank-Token auf der Test-VM
Ohne das Token laufen `dc-testkit license` und `dc-testkit report` ins Leere. Je Projekt eines
anlegen (Besitzerart `dev_agent`, Rechte `bugtracker:manage` und `license:dev`), auf der VM
unter `~/.config/dc-testkit/` hinterlegen und in der Belegungsliste vermerken. Deckt sich mit
#84 — dasselbe Token traegt beides.
---
## I — Roadmap im Deploymentcenter
Diese Datei war bis 2.6.1 der einzige Ort fĂŒr Planung — und pflegte damit
Status, Reihenfolge und ZustÀndigkeit von Hand, neben einem Bugtracker, der
genau diese drei Dinge bereits fĂŒhrt. Zwei Pfleger fĂŒr dasselbe Feld.
Ab 2.7.0 gilt die Arbeitsteilung: **Zustand im DC, BegrĂŒndung hier.**
### [I] #99 ff. — Migration, Modul, Endpunkt, OberflĂ€che, CLI und Leitfaden
Kein neues Modul und keine Roadmap-Tabelle: Ein Roadmap-Eintrag **ist** ein
`bugtracker_item`. Es fehlten nur vier Angaben, die ein Backlog nicht braucht
und eine Planung schon — Themenbereich, Reihenfolge, Zielfassung und der
Auslöser fĂŒr ZurĂŒckgestelltes.
**Die Zugehörigkeit ist ein Feld.** Ein Item steht auf der Roadmap, wenn es ein
`epic` hat. Ein zweites Kennzeichen daneben wÀren zwei Angaben, die dasselbe
behaupten und auseinanderlaufen können.
**Die Kennung ist die Item-ID.** Handvergebene KĂŒrzel (`A12`) erzeugen die
schlimmste Fehlerart: Beide Seiten sind fĂŒr sich stimmig und meinen
Verschiedenes, weil die Kennung nach einer Löschung neu vergeben wurde.
AUTO_INCREMENT vergibt nie zweimal dieselbe Nummer — eine gelöschte Zeile
hinterlÀsst eine hÀngende Referenz, und die *meldet* der Abgleich.
**ZurĂŒckstellen verlangt einen Auslöser.** `status = deferred` ohne
`defer_trigger` wird abgelehnt, in Repository, API und OberflĂ€che gleichermaßen.
Ohne benannten Anlass ist ein Vorhaben nicht zurĂŒckgestellt, sondern vergessen —
und die Regel gehört an die Stelle, an der geschrieben wird, nicht nur in ein
Formular.
### [I] #107 — diese Datei ĂŒbernehmen
Die EintrĂ€ge A1–G9 stehen noch als handvergebene KĂŒrzel hier. Sie werden Items;
die Abschnitte werden Themenbereiche (in Migration 016 bereits angelegt).
Danach ersetzt ein erzeugter Block die Statustabellen, und die Prosa bleibt.
**Reihenfolge:** erst #106 (Migration), dann #107, dann #109 (Abgleich im Deploy).
#108 kommt zuletzt — die anderen Projekte bekommen ein Verfahren, das hier
einmal durchlaufen ist, nicht eines aus der Anleitung.
Bis dahin gilt diese Datei unverÀndert weiter. Sie ist erst abgelöst, wenn der
Block darin steht.
### [I] #110 — Auswertung der Verweildauern
**Auslöser:** wenn die Frage „warum dauert das so lange?" tatsĂ€chlich gestellt
wird. `status_changed_at` und das strukturierte `meta_json` aus 2.6.1 tragen
die Antwort bereits; eine Auswertung daneben lohnt erst, wenn jemand sie liest.
---
## H — Verworfen
Diese Punkte sind geprĂŒft und abgelehnt. **Nicht erneut vorschlagen** — und
falls doch, dann nur mit einem Argument, das hier noch nicht steht.
| | Vorschlag | Warum nicht |
|---|---|---|
| #111 ❌ **Supervisor-Beobachter im ausgelieferten Programm** (auch regelbasiert, ohne Sprachmodell) | Zu viele Baustellen fĂŒr den Ertrag. Er hĂ€tte in jeder Anwendung Einbau, RĂŒckbau bestehender Vorbereitungen, eigenen Zustand auf Kundenhardware, ein weiteres Token im Binary und eine zweite Fassungspflege gebraucht — und dabei ĂŒberwiegend das gemeldet, was Error-Reporting und Bugtracker ohnehin abdecken. Der Code war fertig und ist am 29.08.2026 wieder entfernt worden; er liegt in der Historie, falls die AbwĂ€gung je anders ausfĂ€llt. **Stattdessen:** Error-Reporting und Bugtracker weiterentwickeln, Befunde serverseitig ermitteln |
| #112 ❌ Sprachmodell-Supervisor auf der Kundenmaschine | API-SchlĂŒssel lĂ€ge auf fremder Hardware; Kontext im Speicher fremder Maschinen; kann nicht im Minutentakt hinsehen; hat keinen Verlauf und sieht die Flotte nicht; antwortet zweimal verschieden auf dieselbe Lage |
| #113 ❌ Quelltext mit dem Client ausliefern, auch verschlĂŒsselt | Der Client muss entschlĂŒsseln können, also kann es der Kunde auch |
| #114 ❌ Deploy-Key oder Repo-Token im Client | Dekompiliert in Minuten |
| #115 ❌ Obfuskation als Schutz einplanen | Verzögert, verhindert nicht |
| #116 ❌ MCP-Werkzeuge 1:1 aus OpenAPI erzeugen | 24 Endpunkte; Werkzeugdefinitionen liegen dauerhaft im Kontextfenster. Ein aufgeblĂ€hter Adapter wĂ€re schlechter als die Prompt-Vorlage, die er ersetzt |
| #117 ❌ `publish`, `provision`, `deactivate` als MCP-Werkzeug | Ein Release gehört in die CI, nicht an ein Werkzeug, das ein Modell im Zweifel „hilfreich" auslöst |
| #118 ❌ Befunde puffern, wenn das DC ausfĂ€llt | Eine wachsende Warteschlange in einer ohnehin auffĂ€lligen Anwendung ist genau der Schaden, den der Supervisor verhindern soll |
| #119 ❌ Benachrichtigung je Befund | Ein Befund behauptet nicht, dass etwas kaputt ist. Wer bei jeder AuffĂ€lligkeit alarmiert, hat nach einer Woche einen Kanal, den niemand mehr liest |
| #120 ❌ Lokale Befund-OberflĂ€che in den Anwendungen | Zweite Wahrheit, die nur den eigenen Ausschnitt kennt. Der Client hĂ€lt keine Historie vor |
| #121 ❌ `enforceProject()` pauschal fĂŒr `dev_agent` öffnen | HĂ€tte auch `publish` und `setup` in fremden Projekten erlaubt. Die Ausnahme wird je Aufrufstelle gesetzt |
| #122 ❌ Feste Schwellwerte je Kennzahl als Hauptweg | Finden nur, woran vorher jemand gedacht hat. Die tragenden Detektoren vergleichen gegen eigenen Verlauf, Vorversion oder Flotte |
---
## Pflege dieser Datei
Die Umstellung ist vollzogen (#107, 29.08.2026). Es gilt die Arbeitsteilung
aus Abschnitt I:
| | Wahrheit | Die andere Seite hÀlt |
|---|---|---|
| Status, Reihenfolge, Zielfassung, Bearbeiter | **Deploymentcenter** | den erzeugten Block zwischen `<!-- dc:roadmap -->`-Markern |
| BegrĂŒndung, Auslöser, Verworfenes | **diese Datei**, außerhalb der Marker | den Verweis `doc_anchor` am Item |
- Ein Vorhaben entsteht **immer im DC**, nie hier. `dc_report` legt es an,
`dc_roadmap_set` hebt es auf die Roadmap, dann erst kommt die Prosa dazu.
So kann ein Punkt, der nur in einer Datei steht und den niemand angeht, gar
nicht erst entstehen.
- Zwischen den Markern **nichts von Hand Àndern**. `php cli/roadmap.php --write`
ĂŒberschreibt es beim nĂ€chsten Lauf.
- Vor dem Ausliefern `php cli/roadmap.php --check --project=deploymentcenter`.
RĂŒckgabewert 1 heißt: Ein Absatz verweist auf ein Item, das es nicht gibt.
- 🧊 und ❌ behalten ihren Absatz hier. Der Statuswert allein sagt nicht, warum —
und ohne das Warum schlÀgt es der nÀchste Agent wieder vor.
- AusfĂŒhrliche Herleitungen gehören ins Archiv, nicht hierher. Diese Datei soll
lesbar bleiben.
- **Keine erfundenen Item-Nummern im Fließtext.** Bei der Übernahme stand im
RĂŒckkanal-Absatz eine ausgedachte Beispielnummer — und die gab es wirklich, in
`predictalytics`. Der Abgleich hat es gemeldet; ein Mensch hÀtte es nie
bemerkt. FĂŒr Beispiele deshalb „das Item" schreiben, nicht „Item Nummer x".